Ponownie zsynchronizuj repozytorium git z nowym plikiem .gitignore


192

Czy możliwe jest „odświeżenie” repozytorium git po zaktualizowaniu pliku gitignore?

Właśnie dodałem więcej ignorancji (?) Do mojego gitignore i chciałbym usunąć rzeczy już w repozytorium pasujące do nowego pliku.



Możliwe, że to rozwiązanie usunie już zatwierdzone pliki pasujące do nowego gitignore?
Christian Wattengård,

100
+1 za wymyślenie słowa „ignoracja”.
Aasmund Eldhuset,

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset to oficjalne
Daniel Springer

1
@ user770: Dziś się nauczyłem!
Aasmund Eldhuset

Odpowiedzi:


371

Rozwiązanie wspomniane w „ Nie ignorowaniu pliku .gitignore ” jest nieco ekstremalne, ale powinno działać:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( Upewnij się, aby popełnić pierwsze zmiany, które chcesz zachować , aby uniknąć incydentu jako jball037 komentarze poniżej . Opcja zachować swoje pliki nietknięty na dysku chociaż).
--cached

Masz też inne, bardziej szczegółowe rozwiązanie w blogu „ Sprawianie, aby Git ignorował już śledzone pliki ”:

git rm --cached `git ls-files -i --exclude-standard`

Bassim sugeruje w swoim wydaniu :

Pliki ze spacją na ścieżkach

W przypadku fatal: path spec '...' did not match any filespojawienia się komunikatu o błędzie , na ścieżce mogą znajdować się pliki ze spacjami.

Możesz usunąć wszystkie inne pliki za pomocą opcji --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

ale niedopasowane pliki pozostaną w twoim repozytorium i będą musiały zostać jawnie usunięte poprzez umieszczenie ich ścieżki w podwójnych cudzysłowach:

git rm --cached "<path.to.remaining.file>"

Przekonałem się, że krok dodawania git jest niepotrzebny, kiedy uruchamiam status git po git rm - cache, usunięte pliki są już w obszarze testowym i możesz je po prostu zatwierdzić.
rozdział

3
Właśnie to przeprowadziłem, straciłem wszystkie moje niezaangażowane zmiany i prawie ogłosiłem rezygnację z pracy. Akceptowana odpowiedź w tym wątku uratowała mi życie: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC przepraszam, to nie miał być rant ani kij :) Ale tak, użyłem --cached i wszystkie moje niezaangażowane zmiany zostały utracone, kiedy sprawdziłem moje pliki. Przez chwilę spanikował, ale „git reset HEAD” przywrócił moje pliki (ale tym razem bez plików, które określiłem w .gitignore, więc twoje rozwiązanie nadal działa!)
jball037

3
@ jball037 Good. Dodałem ostrzeżenie i odpowiednio zredagowałem odpowiedź.
VonC

1
jeśli tylko przeczytam jedną linię dalej, zanim to zrobię ”(pamiętaj, aby najpierw zatwierdzić zmiany, które chcesz zachować, aby uniknąć incydentu jako jball037” #fml
Aiden Strydom

9

Mogę źle zrozumieć, ale czy próbujesz usunąć pliki, które zostały zignorowane, czy chcesz zignorować nowe modyfikacje tych plików? W tym przypadku rzecz działa.

Jeśli chcesz usunąć zignorowane wcześniej zatwierdzone pliki, użyj

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

O co chodzi z pojedynczymi cudzysłowami?
IgorGanapolsky

To świetna odpowiedź
Holene

Jest to bardzo proste, dlaczego należy usunąć pliki po aktualizacji mojego .gitignore Jednak wymaga kilku drobnych aktualizacji: `` git rm - buforowane git ls-files -i –exclude-standard git commit -m 'posprzątaj' '
Aaron

1

Wiem, że to stare pytanie, ale rozwiązanie Gracchusa nie działa, jeśli nazwy plików zawierają spacje. Rozwiązaniem VonC do nazw plików ze spacjami jest nieużywanie ich --ignore-unmatch, a następnie usuwanie ich ręcznie, ale nie będzie to działać dobrze, jeśli jest ich dużo.

Oto rozwiązanie wykorzystujące tablice bash do przechwytywania wszystkich plików.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
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.