Pytanie Ignoruj ​​pliki, które zostały już zatwierdzone do repozytorium Git [duplicate]


To pytanie już zawiera odpowiedź:

Mam już zainicjowane repozytorium Git, które dodałem .gitignore plik do. Jak mogę odświeżyć indeks pliku, aby ignorowane pliki były ignorowane?


2192
2017-07-16 19:26


pochodzenie




Odpowiedzi:


Aby usunąć błąd a pojedynczy plik, który został już dodany / zainicjowany do repozytorium, to znaczy, przestań śledzić plik, ale nie usuwaj go z użycia systemu: git rm --cached filename

Aby odjąć każdy plik, który jest teraz w twoim .gitignore:

Najpierw popełnij wszelkie zaległe zmiany w kodzie, a następnie uruchom to polecenie:

git rm -r --cached .

Spowoduje to usunięcie wszelkich zmienionych plików z pliku indeks(obszar przemieszczania), a następnie po prostu uruchom:

git add .

Zatwierdź:

git commit -m ".gitignore is now working"

Cofnąć git rm --cached filename, posługiwać się git add filename.

Pamiętaj, aby zatwierdzić wszystkie ważne zmiany przed uruchomieniem git add .    W przeciwnym razie stracisz wszelkie zmiany w innych plikach.


3658
2017-07-06 17:09



pamiętaj o wcześniejszym zatwierdzeniu wszystkich zmian, w przeciwnym razie stracisz kontrolę nad wszystkimi zmienionymi plikami - Hoang Pham
@TravisWebb Musisz najpierw upewnić się, że skonfigurowałeś .gitignore. Poza tym staram się nie usuwać wszystkich plików z indeksu, tylko te, których potrzebuję, używając modułów Fileglob, takich jak * .o - Jason S
@trobrock, czy możesz edytować odpowiedź, aby zawierała zatwierdzenie na samym początku? z góry. - MEM
Świetna odpowiedź, ale git rm --cached filename wydaje się nieco mniej drastyczne imho .. - Jim Morrison
@ JimMorrison, tęsknisz za sednem. jeśli masz duży projekt ze skomplikowanym plikiem .gitignore (takim jak projekt C # w Visual Studio), znalezienie każdego pojedynczego pliku do usunięcia jest nużące. Te trzy proste polecenia naprawiają wszystko bezboleśnie. - longneck


Jeśli próbujesz ignorować zmiany w pliku, który był już śledzony w repozytorium (np. Plik dev.properties, który musiałbyś zmienić w swoim lokalnym środowisku, ale nigdy nie chciałbyś sprawdzić tych zmian) niż to, co chcesz zrobić jest:

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

Jeśli chcesz ponownie rozpocząć śledzenie zmian

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

Widzieć git-update-index (1) Strona podręcznika.

Spójrz też na skip-worktree i no-skip-worktree opcje dla update-index, jeśli potrzebujesz tego, aby przetrwać po git-reset (przez)


Aktualizacja: Ponieważ ludzie pytali, oto wygodny (i zaktualizowany od czasu komentarza poniżej) alias do sprawdzania, które pliki są obecnie "ignorowane" (--assume-unchanged) w twoim lokalnym obszarze roboczym

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"

518
2017-09-14 23:55



To jest genialne! Świetnie przydatne. Czy wiesz, czy istnieje sposób na uzyskanie listy wszystkich plików "wstrzymanych"? - artfulrobot
To zadziała dla Ciebie: git ls-files -v Jeśli drukowany znak ma małe litery, plik oznaczony jest jako "niezmieniony". widzieć: stackoverflow.com/a/2363495/677381 i: git-scm.com/docs/git-ls-files - dyodji
@dyodji Czy to dotyczy tylko mnie? Lub wszyscy użytkownicy? - wisbucky
Oto moja nieco bardziej gadatliwa wersja ignored alias, jak pojawia się w moim pliku ~ / .gitconfig: ignored = !git ls-files -v $(git rev-parse --show-toplevel) | (grep '^[[:lower:]]' || echo 'None ignored.') && echo '\nIgnore changes with: git update-index --assume-unchanged <file> \nor track again with: git update-index --no-assume-unchanged <file>' Część ta zapewnia, że ​​przeszukuje całe repozytorium. - Chris
Niestety --assume-unchanged nie działa z git stash: zmiany zostaną przywrócone podczas git stash i nie można go ponownie zastosować podczas git stash pop. Widzieć to pytanie. - Scott Weldon


Aby usunąć plik, który został już dodany / zainicjowany do repozytorium, tzn. Przestań go śledzić, ale nie usuwaj go z systemu: git rm --cached filename


351
2017-07-18 08:15



To był idealny sposób na usunięcie kilku dodanych przeze mnie plików, zatwierdzonych, ale później zrozumiałe, że nie trzeba ich śledzić. Po dodaniu tych plików do pliku .gitignore, udało mi się to zrobić i idealnie je spakować. - Andrew Larned
Wskazówka: na przykład, jeśli dodasz *.config dla Twojej .gitignore, możesz to zrobić git rm --cached *.config aby zatrzymać śledzenie wszystkich *.config akta. - dav_i
Pamiętaj również, że spowoduje to usunięcie plików z innych repozytoriów, do których będziesz naciskać, nawet jeśli pozostaną one w twoim systemie. Jeśli po prostu ignorujesz zmiany w plikach i nie chcesz ich usuwać z repozytoriów innych użytkowników, spróbuj tego użyć git update-index --assume-unchanged file.name - dav_i
IMO, to jest poprawna odpowiedź. Odpowiedź na wiki działa - trochę, ale jest okropnie ciężka, szczególnie biorąc pod uwagę pytanie. (Naprawiłbym wiki, ale nie jestem pewien jak. "Wkrótce!";) - Olie
@Olie bądź niezwykle ostrożnie z tym "rozwiązaniem". To będzie usuń plik z repozytorium, a każdy, kto wyciągnie tę zmianę, również usunie ten plik. Najlepszym rozwiązaniem byłoby assume-unchanged, jak powiedział @ dav_i, lub --skip-worktree jako alternatywa. - Sebastianb


Tak - .gitignore system ignoruje tylko pliki nie objęte kontrolą wersji z git.

To znaczy. jeśli już dodałeś plik o nazwie test.txt za pomocą git-add, a następnie dodanie test.txt do .gitignore nadal spowoduje zmiany w test.txt do śledzenia.

Powinieneś git rm test.txt najpierw i zatwierdzić tę zmianę. Tylko wtedy zmieni się na test.txt być zignorowanym.


78
2018-02-02 15:59



To nie do końca prawda, możliwe jest ignorowanie zmian w śledzonym pliku ... zobacz moją odpowiedź: stackoverflow.com/a/11366713/677381 - dyodji
git update-index --assume-unchanged <plik> i git rm --caheced <plik> tak naprawdę nie działał dla mnie. Zrobiłem git rm <plik>, a następnie utworzyłem nowy plik <file> jest z powodzeniem ignorowany. Używam git w wersji 1.8.1 - Jeśli to był problem. - mujaffars
Twoja składnia jest tutaj błędna. jego git rm test.txt i tutaj jest link do bardziej wyczerpującej odpowiedzi stackoverflow.com/questions/12661306/... - Linnea Huxford


Usuń końcowe spacje w .gitignore

Upewnij się również, że nie masz żadnych spacji w twoim .gitignore. Dostałem się do tego pytania, ponieważ szukałem odpowiedzi, a potem miałem zabawne uczucie, że powinienem otworzyć edytor zamiast tylko cat'ować .gitignore. Usunięto pojedynczą dodatkową przestrzeń od końca i puf Teraz działa :)


50
2017-07-15 07:22



Miałem dokładnie ten sam problem: P. Z tego też powodu doszłam do tego pytania. Dobrze, że masz to udokumentowane tutaj. +1 - Hindol
Jeśli lubisz mnie, użyj vi, aby szybko edytować .gitignore użyj ": set list", aby pokazać białe znaki. - Sam Giles
Zdarzyło mi się to, kiedy zrobiłem echo node_modules >> .gitignore (przynajmniej w oknach) - Khôi
Przez kilka tygodni byłem sfrustrowany tym, dopóki nie zobaczyłem waszych białych znaków. Dzięki, naprawiłem mój problem. - Blazes


Postępowałem zgodnie z tymi krokami

git rm -r --cached .
git add .
git reset HEAD

po tym git usuwa wszystkie pliki (* .swp w moim przypadku), które powinny być ignorowane.


40
2018-03-02 09:00



bądź ostrożny z tym, ponieważ zakłada, że ​​chcesz dodać wszystkie pliki z wyjątkiem tego, co jest ignorowane, a zazwyczaj tak nie jest - RoeeK


Jeśli chcesz zatrzymać śledzenie pliku bez usuwania pliku z lokalnego systemu, który wolę ignorować config/database.yml plik. Po prostu spróbuj:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

teraz dodaj ten plik do .gitignoreplik i zatwierdz zmiany. Odtąd wszelkie zmiany wprowadzone w pliku config / database.yml nie będą śledzone przez git.

$ echo config/database.yml >> .gitignore

Dzięki


37
2017-08-21 14:20





Aby usunąć tylko kilka konkretnych plików z śledzenia:

git update-index --assume-unchanged path/to/file

Jeśli chcesz ponownie rozpocząć śledzenie:

git update-index --no-assume-unchanged path/to/file                      

28
2018-04-17 07:21





Jak mówi dav_i, aby zachować plik w repozytorium, a mimo to usunąć go ze zmian bez tworzenia dodatkowego zatwierdzenia, możesz użyć:

git update-index --assume-unchanged filename

26
2018-04-12 20:39



Cofnij : git update-index --no-assume-unchanged filename - Chemical Programmer
co jeśli chcesz zrobić to dla wszystkich plików w folderze za jednym razem? - bg17aw


Nie wiedząc dokładnie, co zrobił rozkaz "odpowiedź", przebiegłem go, ku mojemu przerażeniu. Rekursywnie usuwa każdy plik z repozytorium git.

Stackoverflow na ratunek ... Jak przywrócić "git rm -r."?

git reset HEAD

Zrobiłem lewę, odkąd nie zwolniłem lokalnych plików, których nie chciałem nadpisać.


24
2017-07-19 05:38



The git rm -r --cached . nie działa dla mnie. Git wciąż twierdził, że mój plik tekstowy nie był śledzony, mimo że plik .tmproj znajduje się w moim globalnym pliku zignorowania. Zresetowanie mojej lokalnej dystrybucji w ten sposób działało. Właściwie dodałem opcję "twardą", jak w git reset --hard HEAD. To powinno mieć prawie taki sam efekt w tym przypadku. - IAmNaN
Uważaj na --hard flaga. To będzie wyrzucać wszelkie niezatwierdzone zmiany bez ostrzeżenia! - Mikko Rantalainen


Kompleksowe odpowiedzi wszędzie!

Po prostu skorzystaj z poniższych

git rm -r --cached .

Spowoduje to usunięcie plików, które próbujesz zignorować ze źródła, a nie z urządzenia master na twoim komputerze!

Potem po prostu popełnij i pchnij!


24
2018-06-18 21:08