W zeszłym roku przeszedłem z Subversion na Git jako mój codzienny VCS i wciąż staram się uchwycić lepsze punkty „Git-think”.
Ten, który ostatnio mnie niepokoi, to „lekki” vs. adnotacje i podpisane tagi. Wydaje się dość powszechnie akceptowane, że tagi z adnotacjami są lepsze niż tagi lekkie we wszystkich rzeczywistych zastosowaniach, ale znalezione przeze mnie wyjaśnienia, dlaczego tak się dzieje, zawsze sprowadzają się do „z powodu najlepszych praktyk” lub „ponieważ są różne” . Niestety, są to bardzo niezadowalające argumenty, nie wiedząc, dlaczego to najlepsze praktyki ani w jaki sposób te różnice są istotne dla mojego użycia Git.
Kiedy po raz pierwszy przestawiłem się na Git, lekkie metki wydawały się być najlepszą rzeczą od krojonego chleba; Mógłbym tylko wskazać na zatwierdzenie i powiedzieć „to było 1.0”. Mam problem z uchwyceniem, że tag może być czymś więcej, ale z pewnością nie mogę uwierzyć, że eksperci Git na świecie wolą tagi z adnotacjami arbitralnie! O co w tym wszystkim chodzi?
(Punkty bonusowe: Dlaczego miałbym kiedykolwiek podpisywać tag?)
EDYTOWAĆ
Udało mi się przekonać, że tagi z adnotacjami to Dobra Rzecz - wiedząc, kto i kiedy jest ważny! W ramach dalszych wskazówek na temat dobrych adnotacji na tagach? Zarówno git tag -am "tagging 1.0" 1.0
próbując podsumować dziennik zatwierdzeń, ponieważ poprzedni tag wydaje się tracić strategie.
git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
Odpowiedzi:
Dużym plusem tagu z adnotacjami jest to, że wiesz, kto go utworzył. Podobnie jak w przypadku zatwierdzeń, czasem miło jest wiedzieć, kto to zrobił. Jeśli jesteś programistą i widzisz, że wersja 1.7.4 została oznaczona (uznana za gotową) i nie jesteś pewien, z kim rozmawiasz? Osoba, której imię znajduje się w tagu z adnotacjami! (Jeśli żyjesz w nieufnym świecie, to również powstrzymuje ludzi przed ucieczką od oznaczania rzeczy, których nie powinni.) Jeśli jesteś konsumentem, ta nazwa jest znakiem rozpoznawczym: to Junio Hamano mówi, że ta wersja git jest niniejszym wydany.
Inne metadane również mogą być pomocne - czasem miło jest wiedzieć, kiedy ta wersja została wydana, nie tylko kiedy dokonano ostatecznego zatwierdzenia. A czasami wiadomość może być nawet przydatna. Może to pomaga wyjaśnić cel tego konkretnego tagu. Być może znacznik kandydata do wydania zawiera trochę listy statusów / zadań do wykonania.
Podpisywanie tagów przypomina podpisywanie czegokolwiek innego - zapewnia jeszcze jeden poziom bezpieczeństwa dla paranoika. Większość z nas nigdy z niego nie skorzysta, ale jeśli naprawdę chcesz wszystko zweryfikować przed zainstalowaniem tego oprogramowania na komputerze, możesz go chcieć.
Edytować:
Co do tego, co napisać w adnotacji tagu, masz rację - nie zawsze jest wiele użytecznych do powiedzenia. W przypadku znacznika numeru wersji domyślnie rozumie się, że oznacza on tę wersję, a jeśli jesteś zadowolony ze swoich dzienników zmian gdzie indziej, nie musisz go tam umieszczać. W tym przypadku najważniejszy jest tagger i data. Jedyną rzeczą, o której mogę myśleć, jest jakiś rodzaj zatwierdzenia z zestawu testowego. Spójrz na tagi git.git: wszystkie mówią tylko „Git 1.7.3 rc1”; wszystko, na czym nam zależy, to imię Junio Hamano.
Jednak w przypadku mniej oczywistych nazw znaczników wiadomość może stać się znacznie ważniejsza. Mogę sobie wyobrazić oznakowanie konkretnej wersji specjalnego przeznaczenia dla jednego użytkownika / klienta, ważnego kamienia milowego niezwiązanego z wersją lub (jak wspomniano powyżej) kandydata do wydania z dodatkowymi informacjami. Wiadomość jest wtedy znacznie bardziej przydatna.
źródło
git help log
podsumowuje to następująco: „Tagi z adnotacjami są przeznaczone do wydania, podczas gdy lekkie etykiety są przeznaczone do prywatnych lub tymczasowych etykiet obiektów”.git tag -a -m 'my message' my-tag; git show my-tag
Mój osobisty, nieco inny pogląd na ten temat:
źródło
Domyślnie Git patrzy tylko na tagi z adnotacjami jako linię bazową dla takich poleceń
git describe
. Pomyśl o znacznikach z adnotacjami jako o drogowskazach, które mają trwałe znaczenie dla ciebie i innych, podczas gdy lekkie znaczniki bardziej przypominają zakładki do późniejszego znalezienia. Dlatego tagi z adnotacjami są warte użycia jako odniesienie, a lekkie tagi nie powinny.Podpisanie znacznika jest gwarancją tożsamości osoby podpisującej. Pozwala użytkownikom na przykład zweryfikować, czy pobrany przez nich kod jądra Linuksa jest tym samym kodem, który faktycznie wydał Linus Torvalds. Podpis może być również stwierdzeniem, że osoba podpisująca gwarantuje jakość i integralność oprogramowania przy tym zatwierdzeniu.
źródło
git push --follow-tags
jest kolejnym poleceniem, które traktuje obiegit describe
. Używam go w systemie ciągłej integracji i kilka razy ciąg wersji nie był zgodny z oczekiwaniami.Podpisanie tagu jest łatwym sposobem na potwierdzenie autentyczności wydania.
Jest to szczególnie przydatne w DVCS, ponieważ każdy może sklonować repozytorium i zmodyfikować historię (np. Poprzez git-filter-branch). Jeśli znacznik jest podpisany, podpis nie przetrwa operacji git-filter-branch, więc jeśli masz zasadę, że każde wydanie jest oznaczane i podpisywane przez podmiot zatwierdzający, możliwe jest wykrycie fałszywego znacznika zwolnienia w repozytorium.
Gdyby nie podpisywanie, nie widziałbym też wiele sensu w tagach z adnotacjami.
źródło
Wciśnij tagi z adnotacjami, zachowaj lekki lokalny
Niektóre zachowania Git rozróżniają je w sposób przydatny dla tego zalecenia, np .:
tagi z adnotacjami mogą zawierać wiadomość, twórcę i datę inną niż zatwierdzone przez nich zatwierdzenie. Możesz więc użyć ich do opisu wydania bez dokonywania zatwierdzenia wydania.
Lekkie tagi nie mają tych dodatkowych informacji i nie potrzebują ich, ponieważ będziesz ich używać tylko do rozwoju.
git describe
bez opcji wiersza poleceń widzi tylko tagi z adnotacjamiman git-tag
mówi:Różnice wewnętrzne
zarówno lekkie, jak i opatrzone adnotacjami tagi to plik,
.git/refs/tags
który zawiera SHA-1w przypadku lekkich tagów SHA-1 wskazuje bezpośrednio na zatwierdzenie:
drukuje to samo co SHA-1 HEAD.
Nic więc dziwnego, że nie mogą zawierać żadnych innych metadanych.
znaczniki z adnotacjami wskazują obiekt znacznika w bazie danych obiektów.
zawiera SHA adnotowanego obiektu znacznika:
a następnie możemy uzyskać jego zawartość za pomocą:
próbka wyjściowa:
I w ten sposób zawiera dodatkowe metadane. Jak widać z danych wyjściowych, pola metadanych to:
Bardziej szczegółowa analiza formatu znajduje się w: Jaki jest format obiektu znacznika git i jak obliczyć jego SHA?
Bonusy
Sprawdź, czy tag ma adnotację:
Wyjścia
commit
dla lekkich,tag
z adnotacjami.Wymień tylko lekkie znaczniki: Jak mogę wyświetlić wszystkie lekkie znaczniki?
źródło
Znalazłem jedno dobre zastosowanie dla lekkich tagów - utworzenie wersji w GitHub z perspektywy czasu.
Wydaliśmy nasze oprogramowanie i mieliśmy niezbędne zatwierdzenia, po prostu nie zadaliśmy sobie trudu, aby utrzymać sekcję „Wydanie” na GitHub. Kiedy poświęciliśmy temu trochę uwagi, zdaliśmy sobie sprawę, że chcielibyśmy również dodać kilka poprzednich wydań, z poprawnymi datami ich wydania.
Gdybyśmy po prostu utworzyli znacznik z adnotacjami na starym zatwierdzeniu, GitHub wziąłby datę wydania z obiektu znacznika. W przeciwieństwie do tego, kiedy stworzyliśmy lekki tag dla tego starego zatwierdzenia, wydanie zaczęło pokazywać poprawną (starą) datę. Pomoc Source @ GitHub, „Informacje o wydaniach”
Wygląda na to, że można również podać żądaną datę zatwierdzenia z adnotacjami, ale dla mnie nie wygląda to tak prosto: https://www.kernel.org/pub/software/scm/git/docs/git-tag. HTML # _on_backdating_tags
źródło
W moim biurze umieścimy adres strony wydania w treści tagu. Strona wydania zawiera szczegółowe informacje o wszystkich nowych funkcjach i poprawkach od czasu ostatniego wydania. Zarząd nie będzie szukał w repozytorium git, aby dowiedzieć się, jakie zmiany się wydarzyły, i miło jest mieć zwięzłą listę tego, co jest w tej wersji.
źródło
Znaczniki z adnotacjami przechowują dodatkowe metadane, takie jak nazwisko autora, informacje o wydaniu, wiadomość znacznika i data jako pełne obiekty w bazie danych Git. Wszystkie te dane są ważne dla publicznego wydania Twojego projektu.
tag git -a v1.0.0
Lekkie tagi to najprostszy sposób na dodanie tagu do repozytorium git, ponieważ przechowują one tylko skrót zatwierdzenia, do którego się odnoszą. Mogą działać jak „zakładki” do zatwierdzenia, dlatego świetnie nadają się do użytku prywatnego.
git tag v1.0.0
Możesz sortować, wyświetlać, usuwać, wyświetlać i edytować stare tagi. Wszystkie te funkcje pomogą Ci zidentyfikować określone wersje wydania kodu. Znalazłem ten artykuł , który pomoże Ci lepiej zrozumieć, co potrafią tagi.
źródło
Dla mnie istotną różnicą jest to, że lekki znacznik nie ma znacznika czasu. Załóżmy, że dodałeś kilka lekkich tagów:
a potem, może później, chcesz uzyskać ostatnio dodany lekki tag. Nie ma na to sposobu. Ani „git opisz”, ani „git tag” nie da ci chronologicznie ostatniego lekkiego tagu. „git tag -l” może zwrócić je wszystkie lub posortować w kolejności leksykalnej, ale nie według daty / godziny. „git opisz - tagi” zwróci „v1”, co zdecydowanie nie jest ostatnim dodanym znacznikiem.
Z drugiej strony, jeśli dodasz tagi z adnotacjami:
zawsze możesz uzyskać znacznik czasu każdego znacznika, a „git opisz” z pewnością zwróci „v3”, który jest naprawdę ostatnim dodanym znacznikiem.
źródło