2014-10-21 15 views
6

Próbując zrozumieć JGit: Retrieve tag associated with a git commit, dotarłem do tego wątku na liście mailingowej JGit: [jgit-dev] Commits and tags.Co oznacza peeling w Git?

W wątku odnosi się do sposobu org.eclipse.jgit.lib.Repositorypeel:

skórki ewentualnie obrane odniesienie do znacznika uwagami.

Mogę tylko znaleźć dwa wzmianki o peelingu w dokumentacji Gita: git-check-ref-format(1) Manual Page i Git Internals - Maintenance and Data Recovery.

Co oznacza termin skórka w Git? Jak to jest przydatne? Co to ma wspólnego z cebulami?

Odpowiedz

8

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 
+0

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

+1

@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

+1

(Aktualizacja: jest to łatwiejsze niż się spodziewałem, ponownie zrobiłem to jako 'anno1' z' anno2' wskazującym na 'anno1'.) – torek

2

"Peeling" odnosi się do dereferencji, np. przechodzenie od ref do obiektu znacznika z adnotacjami do ref na commit, na który wskazuje.

Termin jest również używany w innych przypadkach składni ^{xxx}, np. aby przejść z zatwierdzenia do drzewa z abc1234^{tree}.

+0

zastanawiałem się co to '^ {}' składnia było. Niezła, dzięki. –