Dlaczego powinienem dbać o tagi lekkie i opatrzone adnotacjami?

346

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.0próbując podsumować dziennik zatwierdzeń, ponieważ poprzedni tag wydaje się tracić strategie.

Ben Blank
źródło
Czy znalazłeś dobrą odpowiedź na swoje uzupełnienie? Coś jak? git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
dalore
Podsumowanie dziennika zmian od czasu poprzedniego tagu wydaje mi się doskonałą strategią dla komunikatów tagu.
rooby
FYI (1.) Aby wyświetlić listę LEKKICH znaczników według daty, przejdź tutaj . (2.) Aby wyświetlić ANNOTATED tag według daty, przejdź tutaj .
Trevor Boyd Smith

Odpowiedzi:

272

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.

Cascabel
źródło
4
tylko dla porównania z SVN, ponieważ OP pochodzi z tego systemu: metadane znacznika z adnotacjami są równoważne z faktyczną zmianą SVN sprawia, że ​​znacznik rozgałęzia się, który w SVN ma własnego autora i komunikat. I potencjalnie oddzielne ograniczenia dotyczące tego, kto może utworzyć tag, w odróżnieniu od tego, kto może rejestrować zmiany - rozróżnienie, które nie ma znaczenia, jeśli używasz systemu do własnych celów.
araqnid
10
Ah-ha! Wygląda na to, że moje zrozumienie tutaj było utrudnione przez fakt, że wszystkie moje dotychczasowe projekty Git były solowe. Nigdy nie musiałem wiedzieć, za kogo winić (zawsze to ja!), Więc nie zauważyłem, że lekkie tagi nie śledzą taggera.
Ben Blank
5
git help logpodsumowuje to następująco: „Tagi z adnotacjami są przeznaczone do wydania, podczas gdy lekkie etykiety są przeznaczone do prywatnych lub tymczasowych etykiet obiektów”.
Jon Gjengset
1
@javabrett Chociaż jest to dobra odpowiedź na „jakie są różnice między tagami z adnotacjami a lekkimi”, pytanie dotyczyło w szczególności tego, dlaczego ludzie chcą przechowywać dodatkowe informacje, a tym samym używać tagów z adnotacjami. (I nie sądzę, żebym mógł poważnie powiedzieć, że „tworzy kroplę” jest wadą - robisz to, co musisz zrobić, aby przechowywać informacje, które chcesz przechowywać, a jeśli są to istotne informacje, będzie to wymagało kropli. )
Cascabel,
1
@ Chris tak, jak mówi odpowiedź: „Dużym plusem tagu z adnotacjami jest to, że wiesz, kto go utworzył”. Zawsze możesz spróbować swoich sił, aby się dowiedzieć:git tag -a -m 'my message' my-tag; git show my-tag
Cascabel,
64

Mój osobisty, nieco inny pogląd na ten temat:

  • Tagi z adnotacjami to te, które mają zostać opublikowane dla innych programistów, najprawdopodobniej nowe wersje (które również powinny zostać podpisane). Nie tylko zobaczyć, kto oznaczył tag i kiedy został oznaczony, ale także dlaczego (zazwyczaj dziennik zmian).
  • Lekkie są bardziej odpowiednie do użytku prywatnego, co oznacza oznaczanie specjalnych zatwierdzeń, aby móc je ponownie znaleźć. Może trzeba je przejrzeć, sprawdzić, aby coś przetestować.
Koraktor
źródło
4
To jest również wymieniona na człowieka git-tag: „adnotacjami znaczniki są przeznaczone do uwolnienia podczas lekkie znaczniki są przeznaczone dla prywatnych lub tymczasowych etykiet obiektów.”: Stackoverflow.com/a/35059291/895245
Ciro Santilli郝海东冠状病六四事件法轮功
28

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.

Phil Miller
źródło
1
git push --follow-tagsjest kolejnym poleceniem, które traktuje obie
te zasady
1
Dzięki za podpowiedź git describe. Używam go w systemie ciągłej integracji i kilka razy ciąg wersji nie był zgodny z oczekiwaniami.
jjmontes
9

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.

Cwilper
źródło
1
Właściwie do tego przydałby się podpis, który podpisuje tylko zatwierdzone drzewo, a nie całą jego historię (nie dbam o to, czy ktoś ingerował w historię, chcę tylko mieć pewność, że mam odpowiedni kod).
Paŭlo Ebermann
9

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 push --follow-tags wypycha tylko tagi z adnotacjami
  • git describe bez opcji wiersza poleceń widzi tylko tagi z adnotacjami

man git-tag mówi:

Znaczniki z komentarzami są przeznaczone do wydania, a lekkie znaczniki są przeznaczone do prywatnych lub tymczasowych etykiet obiektów.

Różnice wewnętrzne

  • zarówno lekkie, jak i opatrzone adnotacjami tagi to plik, .git/refs/tagsktóry zawiera SHA-1

  • w przypadku lekkich tagów SHA-1 wskazuje bezpośrednio na zatwierdzenie:

    git tag light
    cat .git/refs/tags/light
    

    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.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    zawiera SHA adnotowanego obiektu znacznika:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    a następnie możemy uzyskać jego zawartość za pomocą:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    próbka wyjściowa:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <[email protected]> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    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

Ciro Santilli
źródło
6

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

evilkos
źródło
Chociaż dzisiaj dowiedziałem się, że GitHub przestał honorować dla mnie daty tagów (zarówno dla tagów lekkich, jak i z komentarzami). Po prostu ignoruje datę opublikowania wydania i zamiast tego pamięta datę i godzinę, kiedy nacisnąłem przycisk „Publikuj” dla wydania.
evilkos
Tak, natknąłem się również na ten bałagan związany z GitHub i tagami z adnotacjami. Nie zrozumiałem, dlaczego wprowadzili to w ten sposób ...
JakowL
1

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.

David
źródło
0

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.

Nesha Zoric
źródło
0

Dla mnie istotną różnicą jest to, że lekki znacznik nie ma znacznika czasu. Załóżmy, że dodałeś kilka lekkich tagów:

git tag v1
git tag v2
git tag v3

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:

git tag v1 -m v1
git tag v2 -m v1
git tag v3 -m v1

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.

Ezh
źródło
Aby użyć adnotacji, musisz użyć -a.
Alex