Git – ignorowanie zmian w wymaganym pliku

GIT

Wszelakie pliki tymczasowe, przeważnie także obrazy i inne media, dodaje się do pliku .gitignore po to by w ogóle nie były indeksowane. A co jeśli plik jest wymagany, by aplikacja działała poprawnie, ale jego zawartość może ulegać zmianie, np. w zależności od instancji lub chwilowych zmian w konfiguracji?

Gdy plik zostanie już raz zaindeksowany, można przestać śledzić jego stan usuwając wszystkie informacje z repozytorium dotyczące tego pliku, wykonując komendę git rm --cached nazwa_pliku i dodając odpowiedni wpis do pliku .gitignore. Nie jest to jednak to, co chcielibyśmy osiągnąć w przypadku plików, bez których aplikacja przestaje działać – bo co w przypadku, gdy zrobimy git clone? Nasza nowa instancja nie będzie zawierała tego pliku i grozi nam fatal error. Samo dodanie do .gitignore również nie rozwiązuje problemu, bo Git tak czy siak podpowiada zmiany w pliku i z łatwością można nieświadomie zatwierdzić zmiany w tym pliku używając git commit -a.

Z pomocą przychodzi mechanizm Gita, któremu możemy zasugerować, że zmiany w zaindeksowanym pliku nas nie obchodzą. Git zachowuje się wtedy tak, jakby plik miał dokładnie tą samą zawartość co wtedy, gdy był commitowany. Realizowane jest to za pomocą komendy update-index, a konkretniej git update-index --assume-unchanged <nazwa_pliku>. Oczywiście raz „zignorowany” plik możemy zacząć śledzić na nowo, wydając komendę git update-index --no-assume-unchanged <nazwa_pliku>, co daje deweloperom pole manewru i pozwala na odsianie zmian, których aktualnie nie chcą zatwierdzać (przebijanie się przez listę zmienionych plików przed każdym commitem bywa męczące) i ewentualne powracanie do nich, gdy już przyszła ich kolej.

Łatwo się jednak zagubić w tym co zostało „zignorowane”, a co nie, więc żeby sobie ułatwić jeszcze bardziej, możemy zdeklarować globalny alias git config --global alias.ignored '!git ls-files -v | grep "^[[:lower:]]"', dzięki któremu wywołując komendę git ignored uzyskamy listę plików, które w danym repozytorium posiadają bit assume-unchanged (takie pliki komenda git ls-files -v listuje używając małych liter dla flagi pliku, poczytaj).

Przydatne np. dla konfiguracji połączeń z bazą danych, definicji stałych określających ścieżki do plików i tego typu rzeczy, które są potrzebne, które mogą się różnić w zależności od środowiska, w którym uruchamiana jest aplikacja, a których zmian nie ma potrzeby commitować bo nijak nie wpływają na historię wersji.

Komentarze do "Git – ignorowanie zmian w wymaganym pliku": (2)

  1. A co jeżeli po:

    git update-index –no-assume-unchanged

    zrobimy merge 1 gałęzi do drugiej np. test->master?

    Czy plik przejdzie między gałęziami?

    • Nie do końca rozumiem problem, o którym piszesz. Index w Gicie jest globalny, czyli ustawienie git update-index –assume-unchanged <plik> powoduje, że plik jest traktowany jako niezmieniony bez względu na to w jakiej gałęzi się znajdujemy. Natomiast jeżeli przed wykonaniem tej komendy zostały zatwierdzone jakieś zmiany w gałęzi test, to przy wykonywaniu git merge test te zmiany wejdą do gałęzi master nawet jeśli plik ma bit assume-unchanged. Ten bit nie wpływa na historię (czyli na już zatwierdzone zmiany), ale na katalog roboczy, traktując plik jako niezmieniony nawet jeśli go edytujemy.

Skomentuj "Git – ignorowanie zmian w wymaganym pliku":

Musisz się zalogować, aby móc dodać komentarz.