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:).
Stary, zacząłeś przynudzać. Proszę zacznij znowu pisać o .NET, programowaniu w ogóle itp.
@munzdr:
Kontrola wersji to moim zdaniem kluczowy aspekt tworzenia oprogramowania, a że mnie ostatnio wzięło na eksperymenty w tym zakresie to i takie treści na blogu. Inne posty są na razie "pending". Ale skoro cie nudzą to mozesz mnie wywalic z RSSa i wysle ci maila jak skoncze pisac o Gicie:). (bo jeszcze kilka notek o tym mam w zanadrzu, pomimo tego ze sa nudne)
@procent Pisz o Gicie, pisz. Jestem coraz bliżej wykorzystywania systemu wersjonowania plików, gdyż jak wiadomo: programiści dzielą się na dwie grupy — ci, którzy robią kopie zapasowe i ci, którzy będą je robili :>
@munzdr — przecież nie musisz czytać wpisów dotyczących Gita, a poczekać na te o .Net.
@szmergiell – dziela sie tez na takich ktorzy sami odkrywaja nowe rozwiazania/mozliwosci (np. Spolsky) i takich ktorzy tylko czytaja gotowce lub potrafia kopiowac czyjes pomysly/zachowania ;)
@procent, @munzdr: mnie akurat tematyka gita odpowiada ;) Z resztą… trochę różnorodności przyda się na każdym blogu.