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:
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.
Author: Joanna
Piszę kody, które (zazwyczaj) działają. Tresuję Wordpressa, kodzę z Reactem, zgłębiam świat DevOps i klikam w konsoli Linuxa. Hobbystycznie optymalizuję kod, bo lenistwo to najczystsza forma produktywności. Staram się nie zwariować między bugiem a deadlinem.