Git - ignorowanie zmian plików z repozytorium Skip to content →

Git – ignorowanie zmian plików z repozytorium

Ktoś kiedyś dodał plik z logami do repozytorium. Polecenie git status  wyświetla całą listę zmian – głównie logi. Rozwiązaniem jest ich ignorowanie czyli dodanie folderu
z logami do .gitignore . Dodajemy, ale po sprawdzeniu statusu indexu i możemy być lekko zaskoczeni – zmiany są nadal widoczne. Zastanówmy się jak możemy takie zmiany ignorować.

Aktualizacja indexu

Pierwszym rozwiązaniem jest zapewnienie, że dane pliki nigdy się już nie zmienią. Prześledźmy przykład.

Najpierw tworzymy repozytorium

Następnie dodajmy folder  public/images/imported  do naszego nowego repozytorium. Wewnątrz znajdują się grafiki  .png. Plik .gitignore  jest jeszcze pusty.

Wynik wywołania ostatniej komendy powinien zawierać informacje o braku zmian. Teraz dodajmy folder public/images/imported  do pliku .gitignore  i edytujmy dowolny plik
z folderu imported. Po podmianie pliku git status pokaże wykonaną modyfikację, pomimo że folder imported powinien być ignorowany. Rozwiązaniem jest zapewnienie, że zawartość wskazanego folderu nigdy się nie zmieni:

Gdy wykonamy polecenie git status nie powinniśmy już zobaczyć zmienianych plików z powyższej ścieżki.

Oficjalna dokumentacja:

When this flag (–assume-unchanged) is specified, the object names recorded for the paths are not updated. Instead, this option sets/unsets the “assume unchanged” bit for the paths. When the “assume unchanged” bit is on, the user promises not to change the file and allows Git to assume that the working tree file matches what is recorded in the index. If you want to change the working tree file, you need to unset the bit to tell Git. This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs).

Jeżeli zajdzie potrzeba zmiany plików należy wykonać komendę:

Na potrzeby tego rozwiązania sprawdziłem dodatkowy scenariusz:

Jak widać nie było najmniejszych problemów z połączeniem obu gałęzi. Z zaproponowanego rozwiązania korzystałem już kilka razy, ale ani razu nie trafiłem na jego efekty uboczne.

Usunięcie z repozytorium

Drugim rozwiązaniem jest usunięcie plików z repozytorium. Problem z usunięciem jest taki, że plik musi zostać usunięty tylko z repozytorium – nie możemy go usunąć ani lokalnie, ani na serwerze.

Jako drugi przykład weźmy plik z logami. Dodajmy cały folder logów do repozytorium:

Następnie powinniśmy zignorować folder logs  w pliku .gitignore i na próbę edytować jeden z plików. Git status ponownie pokaże zmiany w pliku, który powinien być ignorowany. W takim razie usuńmy pliki z repozytorium:

O ile w pierwszym przykładzie wystarczyło samo wykonanie polecenia update-index tak w tej metodzie musimy wykonać jeszcze commit potwierdzający usunięcie pliku:

Gotowe. Plik został usunięty tylko z repozytorium.

Minusem tego rozwiązania jest konieczność wypchania zmian. Opinie o edycji repozytorium z poziomu serwera produkcyjnego są podzielone. Nie zawsze mamy odpowiednio skonfigurowany serwer do takich czynności – klucze SSH, ustawienia git. Oczywiście możemy takich zmian dokonać z poziomu środowiska developerskiego.

Podsumowanie

Podczas szukania rozwiązania problemu, o którym wspomniałem we wstępie, trafiłem na komentarze, że zapewnienie o niezmienności plików w pewnch przypadkach nie działa zgodnie z oczekiwaniami. W takim przypadku zazwyczaj pomagało usunięcie plików z repozytrium.