2009-01-20 5 views
32

Ich habe eine Datei in den ‚Index‘ aufgenommen mit:Git - Suche nach dem SHA1 einer einzelnen Datei im Index

git add myfile.java 

Wie kann ich die SHA1 dieser Datei herausfinden?

+1

Nur als Referenz: Art der [die umgekehrte Frage] (http://stackoverflow.com/questions/460331/git-finding-a-filename-from-a-sha1) – Albert

+2

'git rev-parse: myfile.java' – jthill

+0

@jthill, nicht sicher, warum dies keine eigene Antwort ist. – akhan

Antwort

48

Sie wollen die -s Option git ls-files. Dies gibt Ihnen den Modus und den sha1-Hash der Datei im Index.

git ls-files -s myfile.java 

Beachten Sie, dass Sie nicht git hash-object wollen, da dies Ihnen die SHA1-ID der Datei im Arbeits Baum gibt, wie es derzeit ist, nicht von der Datei, die Sie in den Index aufgenommen haben. Diese unterscheiden sich, sobald Sie Änderungen an der Arbeitsbaumkopie nach der git add vornehmen.

+2

Wie bekomme ich echte Datei SHA1 * von git *, als 'sha1sum README.md'? –

18
$ git hash-object myfile.java 
802992c4220de19a90767f3000a79a31b98d0df7 
+0

Vielen Dank! - Das hat den Trick gemacht. –

+9

Hier ist, warum diese Antwort schlechter als die von Charles bewertet wurde: das gibt Ihnen tatsächlich die SHA1 der Version der Datei, die sich im Arbeitsbaum befindet, nicht der indexierten/gestuften Version. Es hat auch den Nachteil, dass es die SHA1 neu berechnen muss, auch wenn sie bereits im Index gespeichert ist. –

+0

@ JanKrüger Danke für die Klarstellung! Sehr hilfreich. Nun ist 'git hash-object' immer noch nützlich für etwas, da man sonst etwas wie' (perl -e '$ size = (-s shift); print "blob $ size \ x00"' foo.txt machen müsste && Katze foo.txt) | openssl sha1'. Außerdem erzeugt es selbst den Hash, während die "ls-files -s" offenbar einen "Cut" benötigen, um diesen Hash zu isolieren. –

59

Es ist eine alte Frage, aber eine Sache bedarf einer Erläuterung:

Diese Frage, die Antworten unter Diskussion über die Git Hash einer Datei, die nicht genau das gleiche wie„die SHA1 dieser Datei " wie in der Frage gefragt.

Kurz:

Wenn Sie die Git Hash der Datei in Index erhalten möchten - siehe the answer by Charles Bailey:

git ls-files -s $file 

Wenn Sie die Git Hash einer Datei erhalten möchten siehe the answer by cnu - auf Ihrem Dateisystem:

git hash-object $file 

Wenn Sie die Git Hash einer Datei auf Ihrem Dateisystem erhalten möchten und Sie haben nicht Git installiert:

(echo -ne "blob `wc -c < $file`\0"; cat $file) | sha1sum 

(Die oben zeigt, wie die Git Hash tatsächlich berechnet wird - es ist nicht die SHA1 Summe der Datei als ein SHA1 Summe der Zeichenfolge „blob sIZE \ 0CONTENT“ wo „blob“ buchstäblich ist eine Zeichenfolge „blob“ (durch ein Leerzeichen folgt), sIZE ist die Dateigröße in Bytes (ein ASCII-Dezimal), "\ 0" ist das Nullzeichen und CONTENT ist der Inhalt der eigentlichen Datei).

Wenn Sie nur „die SHA1 dieser Datei“ erhalten möchten als buchstäblich in die Frage gestellt wurde:

sha1sum < $file 

Wenn Sie nicht über sha1sum Sie shasum -a1 oder openssl dgst -sha1 (mit verwenden können etwas anderes Ausgabeformat).

+2

Hervorragende Antwort, ich möchte zweimal für die Compute-Hash-No-Git-Lösung upvote. – javabrett