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:).