Przejdź do treści

DevStyle - Strona Główna
Git a ignorowanie plików

Git a ignorowanie plików

Maciej Aniserowicz

11 lutego 2010

Tools

System kontroli wersji zbierający WSZYSTKO z naszego working copy byłby bardzo ciężki w użyciu. Dlatego też każdy z nich w ten czy inny sposób umożliwia ignorowanie wybranej zawartości. Kiedyś pisałem o obsłudze tego scenariusza w SVN (post “Ignorowanie “zewnętrznych” plików w repozytorium SVN“), zobaczmy więc dla porównania jak to jest zrealizowane w Gicie.

Ignorowanie nowych plików

Standardowym zachowaniem jest ignorowanie plików, których w ogóle nie chcemy w swoim repozytorium. Dobrym przykładem takiej treści mogą być katalogi zawierające efekt kompilacji projektu (bin, obj etc…), ustawienia szczególne dla konkretnego użytkownika (pliki *.user) czy kod będący efektem pracy jakiegoś generatora (po co trzymać go w repo, skoro każdy może go sobie odtworzyć lokalnie).

Do tego celu służą w git pliki tekstowe o nazwie .gitignore. Każda linia takiego pliku zawiera wzorzec o określonej składni. Jeśli ścieżka do pliku pasuje do tego wzorca -> jest on pomijany we wszelkich komendach, git zachowuje się tak jakby tego pliku tam nie było. .gitignore może znajdować się w każdym folderze repozytorium, co określa zasięg jego działania. Plik z katalogu głównego odnosi się do całej zawartości repozytorium, podczas gdy instrukcje z katalogów wewnętrznych odnoszą się tylko do ograniczonego przezeń obszaru.

Jako że .gitignore stanowią normalną, pełnoprawną zawartość working copy, są wersjonowane i przechowywane jak każdy inny plik. A co za tym idzie – zdefiniowane w nich reguły współdzielone są przez cały zespół.

Dla zapewnienia użytkownikom jak największej kontroli, Git umożliwia także zdefiniowanie ignorowanych plików w innej lokalizacji, która nie jest ZAWARTOŚCIĄ repozytorium a raczej sprawą jego KONFIGURACJI. Co gdybyśmy do katalogu z projektem zażyczyli sobie wrzucić katalog nude-babes, ot tak, aby zawsze mieć go pod (nomen-omen) ręką? Umieszczanie go w repozytorium raczej nie byłoby mile widziane (chociaż kto wie…:) ), a jawne dodawanie go do ignorów może być nieco niezręczne. Rozwiązanie jest bardzo proste: wystarczy dodać linijkę

  nude-babes/

do pliku .git/info/exclude – i już. Zachowanie takie samo jak byśmy umieścili w “publicznych” .gitignore, a jednocześnie mamy pewność, że nikt nam tego pliku nie podejrzy.

O składni wzorców można poczytać w dokumentacji.

Ignorowanie zmian w śledzonych plikach

Jest też inny scenariusz: z jakichś powodów zmodyfikowaliśmy plik już dodany do repozytorium, ale nie chcemy tych zmian wysyłać. Nie chcemy też, aby żadne raporty czy listy pokazywały nam te zmiany.Na przykład umieściliśmy w kodzie nasz login i hasło w celu automatyzacji logowania do aplikacji podczas testów, ale lepiej żebyśmy tych danych nie upubliczniali.

Tutaj rozwiązanie jest trochę mniej intuicyjne i musiałem się go sporo naszukać. Efekt taki zapewni nam komenda update-index z odpowiednią flagą:

  git-update-index --assume-unchanged <ścieżka>

Od tej pory Git zachowuje się, jakbyśmy nigdy nic w tym pliku nie zmieniali. Wyłączyć to można odwrotnością:

  git-update-index --no-assume-unchanged <ścieżka>

I od teraz jesteśmy całkowitymi panami i władcami zawartości repozytorium:).

Zobacz również