Git – ignorowanie plików lokalnie

Jeśli korzystasz z systemu kontroli wersji, takiego jak Git, to z pewnością spotkałeś się z sytuacją, w której masz w projekcie pewne pliki, ale nie chcesz, żeby trafiały do repozytorium – np. pliki z danymi dostępowymi, lokalnymi konfiguracjami środowiska czy tymczasowymi logami. Za wykluczanie plików z repozytorium odpowiada plik .gitignore. Jest to coś w rodzaju filtra, który mówi Gitowi: „nie śledź tych plików ”.

Globalne ignorowanie plików

Każdy wpis w .gitignore sprawia, że Git w ogóle nie dodaje wskazanych plików do repozytorium, są one całkowicie pomijane przy commitowaniu.
To świetne rozwiązanie dla plików, które nigdy nie powinny znaleźć się w historii projektu.

Ale co, jeśli sytuacja jest odwrotna? Masz plik, który musi znajdować się w repozytorium, przykładowo taki, ktory zawiera wspólną konfigurację projektu (np. phpcs.xml.dist czy config.json), a mimo to potrzebujesz zmienić go lokalnie, bez ryzyka, że te zmiany trafią do Gita albo zostaną nadpisane po git pull?

W takim przypadku .gitignore nie pomoże, ponieważ działa tylko na nowe pliki (nie dodane do repozytorium), a nasz plik jest już śledzony. Co w takim razie możemy zrobić?

Ignorowanie plików lokalnie z flagą skip-worktree

Polecenie git update-index --skip-worktree działa trochę jak lokalny .gitignore, ale dotyczy tylko Twojego środowiska. Git wciąż wie o istnieniu tego pliku i trzyma jego wersję w repozytorium, ale przestaje reagować na lokalne zmiany.

Przykład:

git update-index --skip-worktree phpcs.xml.dist

Od tej chwili możesz edytować phpcs.xml.dist tak, jak chcesz – dodać własne reguły, ścieżki, ustawienia. Git nie pokaże go w git status, a Twoje modyfikacje nie zostaną dodane do commita. Co ważne – inni developerzy w zespole nadal widzą oryginalny plik z repozytorium, więc nie zaburzasz wspólnego workflow.

Cofnięcie lokalnego ignorowania

Jeśli chcesz, by Git znowu śledził ten plik normalnie (np. chcesz przywrócić wersję z repo albo zrobić commit zmian), użyj opcji --no-skip-worktree:

git update-index --no-skip-worktree phpcs.xml.dist

Po wykonaniu tej komendy Git znowu zacznie wykrywać zmiany w tym pliku.

Jak sprawdzić, które pliki aktualnie są ignorowane lokalnie

Jeśli chcesz zobaczyć, na które pliki ustawiona jest flaga skip-worktree, wpisz w konsoli:

git ls-files -v | grep '^S'

Litera S przed nazwą oznacza, że plik jest oznaczony jako skip-worktree.

UWAGA: Komenda git update-index --skip-worktree phpcs.xml.dist  pozwala zrobić zmiany w pliku lokalnym i git je zignoruje, ale:

  • najpierw wrzuc komendę, a później rób zmiany w pliku
  • jeśli zrobisz zmiany w pilku na jednym branchu, a na innym ten plik wygląda inaczej, to git nie pozwoli Ci się przełączyć na inny branch (trzeba wtedy „odobserwować” plik. Najlepiej jest zrobić zmiany na każdym branchu na samym początku pracy)
  • Ta flaga działa tylko lokalnie – nie jest widoczna w repo ani dla innych użytkowników
  • Jeśli ktoś inny zmieni ten plik w repozytorium i zrobisz git pull, Git nie scali automatycznie zmian – będzie trzeba to zrobić ręcznie
  • --skip-worktree działa tylko na plikach, które już są śledzone. Nie działa na nowych plikach spoza repo (do tego służy .gitignore)

git update-index --skip-worktree to trochę taki lokalny tryb „nie przeszkadzaj” dla wybranych plików. Dzięki niemu możesz dopasować repozytorium do swojego środowiska pracy, bez ryzyka naruszenia wspólnej bazy kodu.