Już wiesz, że każdy obiekt w repozytorium ma unikalny SHA-1, a także powiązany typ i zawartość. (Z wiersza poleceń użyj git cat-file -t sha1
, aby zobaczyć typ danego obiektu, i git cat-file -p sha1
, aby zobaczyć zawartość, prawdopodobnie z pewnym ładnym drukowaniem zastosowanym, ale generalnie dość surowym formatem.)
Obiekt ze znacznikami w git repozytorium zawiera SHA-1. (Mam nadzieję, że ta część jest jasna i niekontrowersyjna. :-))
Zazwyczaj SHA-1 wewnątrz obiektu oznaczonego adnotacjami - nazwijmy to "identyfikatorem celu", a obiekt w ten sposób nazywany "celem" tag - jest identyfikatorem obiektu commit. W tym przypadku wszystko jest nadal całkiem jasne i proste. Ale co, jeśli nie?
W szczególności celem znacznika z adnotacjami może być inny znacznik z adnotacjami. W takim przypadku musisz pobrać ten drugi znacznik z adnotacjami, który zawiera jeszcze inny identyfikator celu. Musisz powtórzyć ten proces, odrywając tag po tagu, aż dotrzesz do obiektu, który nie jest tagiem. Idealnie byłoby to zatwierdzenie, ale oczywiście może to być dowolny z pozostałych trzech rodzajów obiektów (nie jest jasne, co to znaczy oznaczać drzewa lub blob, tylko zatwierdzenie ma sens).
Ten proces "peelingu" został porównany do obierania cebuli i stąd pochodzi ta fraza.
Zauważ, że jeśli piszesz sprawdzania repozytorium zdrowia, to może być mądry, aby upewnić się, że łańcuch znaczników nie pętlę (na przykład co jeśli tag 1234567
ma 7654321
jako swój cel, a 7654321
jest odnotowany tag z numerem docelowym 1234567
?). (Edycja: jak remram wskazuje w komentarzu, wymaga to "zerwania" SHA-1. Oznacza to, że praktycznie nie jest to możliwe, tak jak nie dostaniesz drzewa, które rekurencyjnie wskazuje na siebie.)
Edit: jak zrobić tag, który wskazuje na inny tag:
... make a repo with a commit that can be tagged ...
$ git tag -a anno1 -m 'annotated tag'
$ git tag -a anno2 anno1 -m 'another tag'
$ git cat-file -p anno1
object d4ec8b2d465de0c087d645f52ba5040586b8ce0f
type commit
tag anno1
tagger Chris Torek <[email protected]> 1413933523 -0600
annotated tag
$ git cat-file -p anno2
object cd1e0637c348e46c645819ef6de36679052b4b7f
type tag
tag anno2
tagger Chris Torek <[email protected]> 1413934239 -0600
another tag
To jest złe. Obiekty z adnotacjami znaczników mogą wskazywać tylko na obiekty commit, a nie inne.Łańcuchy znaczników nie mogą zapętlić się z tych samych powodów, dla których łańcuchy zatwierdzeń nie zapętlają się - funkcja SHA1 nie jest odwracalna. – remram
@remram: punkt, w którym SHA-1 jest nieodwracalny, jest ważny, z wyjątkiem tego, że istnieją roszczenia do złamania go (nie jestem pewien, czy w nie uwierzyć) lub przynajmniej możliwość jego złamania. Jeśli chodzi o znaczniki, które nie wskazują znaczników, to prawdą jest, że 'git -a' nie robi tego domyślnie, ale udało mi się stworzyć znacznik wskazujący na inny znacznik; Będę edytować post. Działa to wystarczająco dobrze: 'git show anno3' pokazuje tag wskazujący na tag' anno1', a następnie podstawowe zatwierdzenie na 'anno1' (' anno2' jest demo, które 'git tag -a' idzie na podstawowe zatwierdzenie). – torek
(Aktualizacja: jest to łatwiejsze niż się spodziewałem, ponownie zrobiłem to jako 'anno1' z' anno2' wskazującym na 'anno1'.) – torek