Jak zignorować pliki, które są w repozytorium?

96

Mam plik (config.php), który jest już zatwierdzony do repozytorium Git, ale chcę zignorować lokalnie, tj. Chcę, aby ten plik pozostał w repozytorium, ale zmusić Gita do zignorowania wszelkich zmian w nim.

Umieściłem plik w .gitignore, ale nadal jest oznaczony jako zmieniony, a Git nadal próbuje wprowadzić zmiany, za każdym razem, gdy coś zatwierdzam. Każdy pomysł, czego mi brakuje lub co robię źle?

prcaen
źródło
proszę dodaj swój plik .gitignore - w ten sposób możemy zobaczyć problemy z nim związane.
Lars

Odpowiedzi:

192

Jeśli plik jest nadal wyświetlany w statusie, mimo że znajduje się w .gitignore, upewnij się, że nie jest już śledzony.

git rm --cached config.php

Jeśli chcesz po prostu zignorować to lokalnie, możesz również zignorować je przez status git:

git update-index --assume-unchanged config.php
VonC
źródło
1
Ok dzięki ! Jeśli połączę moją gałąź z inną, czy ten plik może powodować problemy?
prcaen
1
@ Nimbus147: nie powinno to stanowić problemu, a wszelkie zmiany w tym pliku będą nadal ignorowane (tj. Nie zostaną dodane / zatwierdzone).
VonC
jeśli używasz SmartGit, powinieneś użyć do tego usuwania.
Omid-RH
1
Czy istnieje sposób na wymuszenie update-index --assume-unchangedna zdalnym oddziale? Chciałbym zachować plik w repozytorium, ale nie mógłbym go zmienić przez innych, a ponadto nie byłby dostępny na etapie.
p014k
1
@ p014k Nie o tym wiem. W przypadku tego rodzaju pliku przechowuję go w wersji pod inną nazwą, a następnie używam sterownika filtru treści, aby automatycznie generować odpowiedni plik (prywatny), gdy jest potrzebny. Na przykład ten filtr nie byłby aktywny na scenie. Zobacz stackoverflow.com/a/54454356/6309 i powiązany link.
VonC,
6

Ignoruj ​​wpisany plik:

git update-index --assume-unchanged file

Aby przywrócić

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

Przywróć wszystko

git update-index --really-refresh 
shiva kumar
źródło
Pomocny. Przywracanie jednego pliku działało, ale przywracanie wszystkich nie działało.
Adem Tepe
4

Jeśli plik jest już w repozytorium, a tym samym w obszarze Index / Staging, aktualizacja do .gitignore nie zmieni tej sytuacji - będzie nadal zatwierdzana.

Aby usunąć plik z obszaru indeksu / przemieszczania, użyj git rm <file>.

Philip Oakley
źródło
Co się stanie, jeśli plik jest w repozytorium, ale nie jest jeszcze przemieszczany? Próbuję zignorować pliki * .log, ale nadal widzę je w sekcji „Zmiany”. Chcę zignorować wszystko, co robić?
Sandra K,
@SandraK, jeśli istnieje starsza wersja tego pliku (ścieżka / nazwa pliku) już w repozytorium przy ostatnim zatwierdzeniu, to jest uważana za śledzoną - „indeks” będzie miał ten plik w swoich rekordach, więc statusbędzie nadal informować o tych zmianach. Jeśli chcesz zignorować pliki * .log, zarówno w przypadku plików wcześniej przypiętych, jak i obecnie nieśledzonych, musisz git rm *.logzaktualizować plik .gitignore . Najpierw sprawdź, czy niektóre pliki dziennika są rzeczywiście ważne ... Łatwo zapomnieć o tym specjalnym ;-)
Philip Oakley.
-3

Po umieszczeniu pliku w .gitignore nie można go zmienić.

Możesz więc usunąć plik z listy w jednym zatwierdzeniu, zatwierdzić zmiany w następnym, a następnie ponownie dodać plik do listy ignorowanych w trzecim zatwierdzeniu.

To, co zwykle robię, to dzielenie pliku na dwa, jeden, który jest dozwolony i mogę zmienić, co obejmuje drugi plik, jeśli istnieje, wtedy deweloperzy mogą opcjonalnie wprowadzić zmiany konfiguracyjne w ignorowanym pliku.

erikvold
źródło
1
Gdy plik jest wymieniony w .gitignore, nie możesz go zmienić ” - czy możesz wyjaśnić, co masz na myśli? Mam wiele plików w wielu swoich .gitignorei ciągle je zmieniam! Po raz pierwszy słyszę, jak ktoś mówi, że jak dodam plik .gitignore, nie mogę go zmienić.
trejder
1
On naprawdę się myli. Możesz je zmienić. Git po prostu ich nie przesyła, a nawet daje możliwość przesłania ich.
David