Usuń folder ze śledzenia git

403

Muszę wykluczyć folder (przesyłanie nazw) ze śledzenia. Próbowałem biec

git rm -r --cached wordpress/wp-content/uploads

a potem dodałem ścieżkę do .gitignore

/wordpress/wp-content/uploads

ale kiedy uruchomiłem git status, pojawiają się jako usunięte. Jeśli spróbuję zatwierdzić zmiany, pliki zostaną usunięte, a nie tylko usunięte ze śledzenia.

Co ja robię źle?

Próbowałem też

git update-index --assume-unchanged <file>

ale wydaje się, że wyśledzić tylko pliki. Ale muszę usunąć cały folder (w tym podfoldery) ze śledzenia.

Stefan Diabo
źródło
Usunięte nie oznacza, że ​​git usunie twoje pliki. Jeśli jednak użyjesz reset --hard, będzie.
keltar
2
Jak wspomina @keltar, zatwierdzenie nie spowoduje usunięcia plików. Spowoduje to ich usunięcie z Git , ale twoja kopia robocza nadal je będzie zawierała. Ale jeśli pullpopełnisz gdzie indziej, pliki te zostaną usunięte z nowego systemu.
Chris

Odpowiedzi:

866

Natknąłem się na to pytanie podczas wyszukiwania w Google dla „git usuń folder ze śledzenia”. Pytanie OP doprowadziło mnie do odpowiedzi. Podsumowuję to tutaj dla przyszłych pokoleń.

Pytanie

Jak usunąć folder z mojego repozytorium git bez usuwania go z mojego komputera lokalnego (tj. Środowiska programistycznego)?

Odpowiedź

Krok 1. Dodaj ścieżkę folderu do głównego .gitignorepliku repozytorium .

path_to_your_folder/

Krok 2. Usuń folder z lokalnego śledzenia git, ale zachowaj go na dysku.

git rm -r --cached path_to_your_folder/

Krok 3. Prześlij zmiany do repozytorium git.

Folder zostanie uznany za „usunięty” z punktu widzenia Git (tzn. Znajdują się w przeszłości, ale nie w najnowszym zatwierdzeniu, a osoby korzystające z tego repozytorium zostaną usunięte z drzew), ale pozostaną w katalogu roboczym ponieważ używałeś --cached.

Tod Birdsall
źródło
2
Szybkie pytanie, czy ścieżka do folderu musi być pełną ścieżką? czy po prostu ścieżka z repozytorium git działającym jako baza?
HMSCelestia
Wierzę, że to pełna ścieżka, ale nie pamiętam tego na pewno.
Tod Birdsall
7
„a osoby korzystające z tego repozytorium zostaną usunięte pliki ze swoich drzew” Czy mogę temu zapobiec?
Leo Gasparrini
to poprawnie usunęło moje pliki ze śledzenia w oddziale, ale usunęło je po scaleniu!
Harold
1
dla mnie wciąż pozostaje. Ponadto - czy powinienem odznaczyć te pliki podczas zatwierdzania, które znajdują się w folderze? Próbowałem na dwa sposoby. Jeśli odznaczam, nie pozwala na wypychanie, ale potem zmieniłem jeden znak w innym pliku, który powinien być śledzony. Nadal nie pomaga
Darius.V
44

To działa dla mnie:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch jest tutaj ważne, bez tej opcji git zakończy działanie z błędem w pierwszym pliku spoza indeksu.

co było do okazania
źródło
unknown option 'ignore unmatched'
Inigo
To ważna flaga, jeśli katalog jest pusty, dziękuję!
MNN
bardzo przydatne, jeśli chcesz po prostu usunąć również niektóre rozszerzenia plików z katalogu:git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15
14

Aby zapomnieć katalog rekurencyjnie dodaj /*/*do ścieżki:

git update-index --assume-unchanged wordpress/wp-content/uploads/*/*

Korzystanie git rm --cachednie jest dobre do współpracy. Więcej informacji tutaj: Jak zatrzymać śledzenie i zignorować zmiany w pliku w Git?

witalność
źródło
1
To bardzo eleganckie rozwiązanie! sztuczka z rekurencyjną ścieżką uratowała mi dzień. Dzięki!
Aziz Alto
8

Wiem, że to stary wątek, ale chciałem tylko trochę dodać, ponieważ oznaczone rozwiązanie nie rozwiązało problemu (chociaż próbowałem wiele razy).

Jedynym sposobem, w jaki mogłem zatrzymać śledzenie folderu w git formularzu, było wykonanie następujących czynności:

  1. Wykonaj kopię zapasową folderu lokalnego i umieść w bezpiecznym miejscu.
  2. Usuń folder z lokalnego repozytorium
  3. Upewnij się, że pamięć podręczna jest wyczyszczona git rm -r --cached your_folder/
  4. Dodaj your_folder/do .gitignore
  5. Zatwierdź zmiany
  6. Dodaj kopię zapasową z powrotem do repozytorium

Powinieneś teraz zobaczyć, że folder nie jest już śledzony.

Nie pytaj mnie, dlaczego samo wyczyszczenie pamięci podręcznej nie zadziałało, nie jestem super czarodziejem Git, ale tak rozwiązałem problem.

lukehillonline
źródło
Dziękuję Ci!!! Git doprowadzał mnie do szału, nie ignorując folderu .metadata zaćmienia. Śledziłeś swoje kroki z folderem zaćmienia .metadata i nareszcie zadziałało.
MasterN8
5

Z dokumentacji git:

Inną przydatną rzeczą, którą możesz chcieć zrobić, to zachować plik w drzewie roboczym, ale usunąć go z obszaru przejściowego. Innymi słowy, możesz chcieć zachować plik na dysku twardym, ale Git już go nie śledzi. Jest to szczególnie przydatne, jeśli zapomniałeś dodać coś do pliku .gitignore i przypadkowo go zainscenizował, na przykład duży plik dziennika lub kilka skompilowanych plików .a. Aby to zrobić, użyj opcji --cached:

$ git rm --cached readme.txt

Więc może nie dołączasz „-r”?

użytkownik3750325
źródło
1
OP już próbował --cached. -rOpcja jest dla „rekursywnego”, które powinny być zawarte w tej instancji.
Chris
Uważam to za przydatne. Szukałem, jak to zrobić w folderze, a potem zobaczyłem, jak to zrobić w pliku. Poprawiam ten komentarz.
światło