Wie ist das git-hash berechnet?
Ich versuche zu verstehen, wie git berechnet den hash des refs.
$ git ls-remote https://github.com/git/git
....
29932f3915935d773dc8d52c292cadd81c81071d refs/tags/v2.4.2
9eabf5b536662000f79978c4d1b6e4eff5c8d785 refs/tags/v2.4.2^{}
....
Clone das repo lokal. Überprüfen Sie die refs/tags/v2.4.2^{}
ref von sha
$ git cat-file -p 9eabf5b536662000f79978c4d1b6e4eff5c8d785
tree 655a20f99af32926cbf6d8fab092506ddd70e49c
parent df08eb357dd7f432c3dcbe0ef4b3212a38b4aeff
author Junio C Hamano <[email protected]> 1432673399 -0700
committer Junio C Hamano <[email protected]> 1432673399 -0700
Git 2.4.2
Signed-off-by: Junio C Hamano <[email protected]>
Kopieren Sie den dekomprimierten Inhalt, so dass wir Hashen.(AFAIK git verwendet die unkomprimierte version, wenn es hashing)
git cat-file -p 9eabf5b536662000f79978c4d1b6e4eff5c8d785 > fi
Let ' s SHA-1 für den Inhalt verwendet git die eigene hash-Befehl
git hash-object fi
3cf741bbdbcdeed65e5371912742e854a035e665
Warum die Ausgabe nicht [9e]abf5b536662000f79978c4d1b6e4eff5c8d785
? Ich verstehe die ersten beiden Zeichen (9e
) ist die Länge in hex. Wie soll ich den hash der Inhalte der fi
so, dass ich die git-ref abf5b536662000f79978c4d1b6e4eff5c8d785
?
- (1)
git hash-object
ist das hinzufügen von Dateien, die nicht für andere Objekttypen. Offensichtlich geben angehängt wird, um Hash-content-irgendwie. Und ich Wette, 9e ist nicht die Länge der gesamten Zeile wird ein sha1-hash als Algorithmus gibt es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie beschrieben in "Wie ist git commit sha1 gebildet ", die Formel ist:
Im Fall der Begehen 9eabf5b536662000f79978c4d1b6e4eff5c8d785 (das ist
v2.4.2^{}
, und die verwiesen wird, ein Baum) :Geben 9eabf5b536662000f79978c4d1b6e4eff5c8d785.
Als würde:
(noch 9eabf5b536662000f79978c4d1b6e4eff5c8d785)
Ähnlich, Berechnung der SHA1-tag v2.4.2 wäre:
Geben würde 29932f3915935d773dc8d52c292cadd81c81071d.
(printf "tree %s\0" $(git cat-file tree 9eabf5b536662000f79978c4d1b6e4eff5c8d785 | wc -c); git cat-file tree 9eabf5b536662000f79978c4d1b6e4eff5c8d785 )|sha1sum 655a20f99af32926cbf6d8fab092506ddd70e49c
tree
. Das funktioniert (mit -hübsch und commit). Keine Ahnung warum es funktioniert mit Begehen, wenn es ist ein 'Baum' ?(printf "commit %s\0" $(git cat-file -p 9eabf5b536662000f79978c4d1b6e4eff5c8d785 | wc -c); git cat-file -p 9eabf5b536662000f79978c4d1b6e4eff5c8d785 )|sha1sum 9eabf5b536662000f79978c4d1b6e4eff5c8d785
Gibt es etwas Verwirrung hier. Git verwendet verschiedene Arten von Objekten: blobs, trees und commits.
Den folgenden Befehl ein:
Gibt den Typ des Objekts für einen bestimmten hash.
Also in deinem Beispiel die hash-9eabf5b536662000f79978c4d1b6e4eff5c8d785 entspricht einem commit-Objekt.
Nun, wie Sie selbst eingerechnet, dies ausführen:
Gibt Sie den Inhalt des Objekts je nach deren Typ (in diesem Fall ein commit).
Aber dieses:
...berechnet den hash für ein blob, dessen Inhalt die Ausgabe des vorherigen Befehls (in deinem Beispiel), aber es könnte etwas anderes sein (wie "hello world!"). Hier versuchen Sie dies:
Der output ist der gleiche wie der Vorherige Befehl. Dies ist im Grunde, wie Git-hashes ein blob. So zu gestaltet, indem hashing fi, erzeugt ein blob-Objekt. Aber wie wir gesehen haben, 9eabf5b536662000f79978c4d1b6e4eff5c8d785 ist ein commit, nicht ein blob. Also, Sie können keine hash-fi, wie es ist, um den gleichen hash.
Einen commit-hash ist basierend auf einige andere Informationen, die es einzigartig macht (wie die committer, Autor, Datum, etc). Die folgenden Artikel erfahren Sie, was genau einen commit-hash ist aus:
Die Anatomie eines git commit
So konnte man den gleichen hash, indem alle angegebenen Daten sind in dem Artikel mit den exakt gleichen Werten wie in der ursprünglichen Begehen.
Dies könnte ebenfalls hilfreich sein:
Git von unten nach oben