Poniższe nieśledzone działające pliki drzewa zostaną zastąpione przez scalanie, ale mnie to nie obchodzi


344

W moim oddziale miałem kilka plików .gitignore

W innym oddziale tych plików nie ma.

Chcę połączyć inną gałąź z moją i nie dbam o to, czy te pliki nie są już ignorowane, czy nie.

Niestety dostaję to:

Następujące nieśledzone pliki drzewa roboczego zostaną zastąpione przez scalenie

Jak zmodyfikowałbym polecenie ściągania, aby zastąpić te pliki bez konieczności samodzielnego znajdowania, przenoszenia lub usuwania tych plików?





1
To najlepsza odpowiedź, ponieważ spowoduje to usunięcie tylko plików blokujących połączenie: stackoverflow.com/a/52255219/551045
RedX

Odpowiedzi:


537

Problem polega na tym, że nie śledzisz plików lokalnie, ale identyczne pliki są śledzone zdalnie, więc w celu „ściągnięcia” system byłby zmuszony zastąpić pliki lokalne, które nie są kontrolowane pod względem wersji.

Spróbuj uruchomić

git add * 
git stash
git pull

Spowoduje to śledzenie wszystkich plików, usunięcie wszystkich lokalnych zmian w tych plikach, a następnie pobranie plików z serwera.


59
git add -A .; git stashpracował dla mnie. git add *Wariant narzekali ignorowane ścieżkach.
imsky

11
Próbowałem git add., Git stash, git pull. Działało, ale wciąż nie rozumiem dlaczego?
ARK,

1
Dla mnie miałem zdalny plik, który był śledzony i miałem plik o tej samej nazwie w moim lokalnym repozytorium, który nie był śledzony. Tak więc, jeśli dodasz plik lokalny, ukryjesz zmiany, a następnie wyciągniesz, plik zdalny powinien zastąpić plik lokalny.
userFog

2
Oto dobry link, aby zrozumieć, jak to działa, jeśli ktoś jest zainteresowany. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//, To naprawdę nie idzie zbyt daleko w cel tego błędu, naprawdę.
Nathan Basanese

137

Możesz spróbować wykonać polecenie, aby usunąć nieśledzone pliki z lokalnego pliku

Git 2.11 i nowsze wersje:

git clean  -d  -f .

Starsze wersje Git:

git clean  -d  -f ""

Gdzie -dmożna zastąpić następującym:

  • -x ignorowane pliki są również usuwane, a także pliki nieznane Gitowi.

  • -d usuń nieśledzone katalogi oprócz nieśledzonych plików.

  • -f jest wymagane, aby wymusić uruchomienie.

Oto link, który może być również pomocny.


23
Dodałbym -ido trybu interaktywnego. Oprócz usunięcia niechcianego katalogu
usunąłem

6
Warto przejrzeć komentarze do podobnej odpowiedzi, ponieważ -xmoże to zranić.
dumbledad

10
Ale to bardzo niebezpieczne i nie do uniknięcia zadanie !! możesz stracić dużo plików! BĄDŹ OSTROŻNY!!
Mohamed Kawsara

16
To usunęło cały mój katalog dostawców w Slim Framework . Bądź bardzo ostrożny dzięki temu poleceniu
RousseauAlexandre,

2
Powinieneś usunąć „x” z odpowiedzi. To jest bardzo niebezpieczne!
Earl3s

107

Jedyne polecenia, które działały dla mnie, to:

git fetch --all
git reset --hard origin/{{your branch name}}

5
Należy zauważyć, że ta odpowiedź jest potrzebna, jeśli usunąłeś submoduły i przeczytałeś je jako biblioteki w oryginalnym repozytorium. Potrzebowałem odpowiedzi i to wszystko działało.
Routhinator,

Nie miałem podmodułów i próbowałem git clean i git stash, jak sugerowano w innych odpowiedziach, ale tylko to pomogło.
kslstn

Po wyczyszczeniu różnych podmodułów było to jedyne, co zadziałało dla mnie. Na szczególną uwagę miałem problem z rozróżnianiem wielkości liter w pliku. Dawny. XML.php do Xml.php w moim folderze dostawcy od kompozytora.
KazaJhodo

1
Dla mnie też zadziałało. Czy możesz wyjaśnić, co się dzieje? Nie rozumiem
Dimitris Karamanis,

1
To usunęło dwa moje lokalne zatwierdzenia, uważaj przed użyciem!
David Cian

27

Zastąpienie git mergetego spowoduje zastąpienie nieśledzonych plików

Poniższe komentarze używają „FOI” dla „interesujących plików”, czyli plików, które

  • istnieje w oddziale dawcy,
  • nie istnieją w oddziale odbierającym,
  • i blokują scalanie, ponieważ są obecne i nie są śledzone w twoim katalogu roboczym.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Zastąpienie git pulltego spowoduje zastąpienie nieśledzonych plików

pull = fetch + merge, Więc nie git fetchnastępuje git checkout -f, git checkout, git mergesztuczki powyżej.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Szczegółowe wyjaśnienie

git merge -fnie istnieje, ale istnieje git checkout -f.

Użyjemy git checkout -f+git checkout do usunięcia interesujących plików (patrz wyżej), a następnie scalenie może przebiegać normalnie.

Krok 1. Ten krok wymusza zastąpienie niewyśledzonego FOI śledzonymi wersjami gałęzi dawcy (sprawdza również gałąź dawcy i aktualizuje resztę działającego katalogu).

git checkout -f donor-branch

Krok 2. Ten krok usuwa FOI, ponieważ są one śledzone w naszym obecnym oddziale (dawcy) i nieobecne w receiving-branchprzełączamy się do.

git checkout receiving-branch

Krok 3. Teraz, gdy FOI jest nieobecny, scalenie w gałęzi dawcy nie zastąpi żadnych nieśledzonych plików, więc nie otrzymujemy błędów.

git merge donor-branch

3
To jest zbyt czyste, aby być 7. lub 8. odpowiedzią!
Majed DH

1
Dzięki, @MajedDH, uczyniłeś mój dzień! <3
Esteis

1
Właśnie tutaj był instafix, którego szukałem! Dzięki
AFM-Horizon

Cieszę się, że mogłem Ci pomóc, @ AFM-Horizon!
Esteis

20

Usuń wszystkie nieśledzone pliki:

git clean  -d  -fx .

8
usunięcie prawdopodobnie używanych plików w projekcie nie powinno być prawdziwym rozwiązaniem
Erdinç Çorbacı

4
tak, wyczyściłem również pliki IDE :(
kisna


15

Możesz wypróbować to polecenie

git clean -df

5
jaki jest pożytek z usuwania nieśledzonych katalogów? ... mogą być cenne, wiesz.
zhekaus

Czy możesz wyjaśnić, co to robi?
Safak Ozkan

12

Aktualizacja - lepsza wersja

To narzędzie ( https://github.com/mklepaczewski/git-clean-before-merge ) będzie:

  • usuń nieśledzone pliki, które są identyczne z ich git pullodpowiednikami,
  • przywrócić zmiany w zmodyfikowanych plikach, których zmodyfikowana wersja jest identyczna z ich git pullodpowiednikami,
  • zgłoś zmodyfikowane / nieśledzone pliki, które różnią się od nich git pull wersji,
  • narzędzie ma --pretendopcję, która nie modyfikuje żadnych plików.

Stara wersja

Czym różni się ta odpowiedź od innych odpowiedzi?

Przedstawiona tutaj metoda usuwa tylko pliki, które zostałyby zastąpione przez scalanie. Jeśli masz inne nieśledzone (prawdopodobnie zignorowane) pliki w katalogu, ta metoda ich nie usunie.

Rozwiązanie

Ten fragment wyodrębni wszystkie nieśledzone pliki, które zostaną nadpisane git pulli usunie je.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

a następnie po prostu wykonaj:

git pull

To nie jest polecenie git porcelany, więc zawsze dokładnie sprawdź, co by to zrobiło z:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Objaśnienie - ponieważ jeden liner jest przerażający:

Oto podział tego, co robi:

  1. git pull 2>&1- przechwytuj git pulldane wyjściowe i przekieruj je na standardowe wyjście, abyśmy mogli łatwo je przechwycić grep.
  2. grep -E '^\s - celem jest przechwycenie listy nieśledzonych plików, które zostałyby zastąpione przez git pull . Nazwy plików mają przed sobą kilka białych znaków, więc wykorzystujemy je do ich uzyskania.
  3. cut -f2- - usuń białe znaki z początku każdej linii przechwyconej w 2.
  4. xargs -I {} rm -rf "{}"- nas xargsdo iteracji po wszystkich plikach, zapisz ich nazwę w „{}” i zadzwoń rmdo każdego z nich. Używamy -rfdo wymuszania usuwania i usuwania nieśledzonych katalogów.

Byłoby wspaniale zastąpić kroki 1-3 poleceniem porcelany, ale nie znam żadnego odpowiednika.


Dziękuję, często mam nieśledzone pliki w moim katalogu roboczym, których nie chcę usuwać ani zatwierdzać. W moim przypadku musiałem zastąpić git pullzgit checkout <branch_name>
mihow

6

Jeśli zastanawiasz się nad użyciem -fflagi, możesz najpierw uruchomić ją na sucho. Wystarczy, że wiesz z góry, jaką ciekawą sytuację znajdziesz w następnej kolejności ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

Oprócz zaakceptowanej odpowiedzi możesz oczywiście usunąć pliki, jeśli nie są już potrzebne, określając plik:

git clean -f '/path/to/file/'

Pamiętaj, aby najpierw uruchomić go z flagą -n, jeśli chcesz zobaczyć, które pliki usunie git clean. Pamiętaj, że te pliki zostaną usunięte. W moim przypadku i tak się nimi nie przejmowałem, więc było to dla mnie lepsze rozwiązanie.


5

Jednym ze sposobów na to jest ukrywanie lokalnych zmian i pobieranie ze zdalnego repozytorium. W ten sposób nie stracisz lokalnych plików, ponieważ pliki trafią do skrytki.

git add -A
git stash
git pull

Możesz sprawdzić lokalne ukryte pliki za pomocą tego polecenia - git stash list


4

Dla tych, którzy nie wiedzą, git ignoruje różnice nazw wielkich i małych liter w plikach i folderach. To okazuje się koszmarem, gdy zmienisz nazwę na dokładnie taką samą nazwę z innym przypadkiem.

Napotkałem ten problem, gdy zmieniłem nazwę folderu z „Petstore” na „petstore” (wielkie litery na małe litery). Zedytowałem plik .git / config, aby przestać ignorować wielkość liter, wprowadziłem zmiany, zmiażdżyłem swoje commity i ukryłem moje zmiany, aby przejść do innej gałęzi. Nie mogłem zastosować moich ukrytych zmian do tego drugiego oddziału.

Poprawką, którą znalazłem, która działała, była tymczasowa edycja mojego pliku .git / config, aby tymczasowo ponownie zignorować wielkość liter. To spowodowało git stash applysukces. Następnie zmieniłem ignoreCase z powrotem na false. Następnie dodałem wszystko oprócz nowych plików w folderze sklepu, które dziwnie twierdzi Git z jakiegokolwiek powodu. Popełniłem swoje zmiany, a następnie pobiegłemgit reset --hard HEADZatwierdziłem aby pozbyć się nowych, nieśledzonych plików. Moje zatwierdzenie pojawiło się dokładnie tak, jak oczekiwano: nazwy plików w folderze zostały zmienione.

Mam nadzieję, że pomoże ci to uniknąć mojego koszmaru.


Nie działało dla mnie. Usunąłem wszystkie pliki w folderze. Następnie git pull -fpotem git checkout .. Co za koszmar.
m.rufca

Naprawdę? Kilka tygodni temu zadziałało dobrze. Czy próbowałeś edytować plik gitconfig, aby odpowiednio uruchomić / zatrzymać ignorowanie wielkości liter?
A. Davidson,

Dziękuję Ci. Musiałem połączyć się z masterem po naprawieniu obudowy w ścieżce folderu. Byłem w stanie scalić go z włączonym ignorowaniem wielkości liter git, po czym ponownie włączam czułość wielkości liter.
Rubenisme

3

Ani czyste / reset / twarde kasy / rebase nie działało dla mnie.

Właśnie usunąłem pliki, na które Git narzekał *

rm /path/to/files/that/git/complained/about

* Sprawdziłem, czy te pliki można usunąć, sprawdzając zupełnie nowe repozytorium w osobnym folderze (plików tam nie było)


1

W moim przypadku, gdy miałem ten problem. Miałem plik lokalny, którego nazwę zmieniłem na pilocie.

Podczas próby git pullGit powiedział mi, że nowa nazwa pliku nie była śledzona - która była na pilocie, chociaż nie istniała jeszcze na poziomie lokalnym.

Ponieważ nie było tego lokalnie, nie mogłem tego zrobić, git pulldopóki nie zrobiłem git rmna starej nazwie pliku (co początkowo nie było oczywiste z powodu mojego głupiego pomysłu zmiany nazwy).



0

Problem polega na tym, że mamy nadchodzące zmiany, które scalą nieśledzony plik, narzeka git. Te polecenia pomogły mi:

git clean -dxf
git pull origin master
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.