Git hat einen bekannten oder zumindest bekannten leeren Baum, dessen SHA1 lautet:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(Sie können dies in jedem Repo sehen, auch in einem neu erstellten, mit git cat-file -t
und git cat-file -p
).
Wenn Sie hart arbeiten und sehr vorsichtig sind, können Sie diesen leeren Baum verwenden, um ein Verzeichnis zu speichern, das keine Dateien enthält (siehe Antwort auf Wie füge ich einem Git-Repository ein leeres Verzeichnis hinzu ), obwohl dies keine gute Idee ist.
Es ist nützlicher als ein Argument dafür git diff-tree
, was einer der Beispiel-Hooks tut.
Was ich mich frage ist,
- Wie zuverlässig ist dies - dh wird in einer zukünftigen Version von Git kein Git-Objekt nummeriert sein
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - Warum gibt es keinen symbolischen Namen für den leeren Baum (oder gibt es einen?).
(Eine schnelle und schmutzige Möglichkeit, einen symbolischen Namen zu erstellen, besteht darin, den SHA1 einzugeben, z .git/Nulltree
. B .. Leider müssen Sie dies für jedes Repo tun. Scheint besser, nur die magische Zahl in Skripten usw. einzufügen. Ich habe nur eine allgemeine Abneigung zu magischen Zahlen.)
git hash-object -t tree /dev/null
Methode (aus der Antwort von VonC unten) hat den Vorteil, dass SHA-1 nicht fest codiert wird, falls eine zukünftige Version von git beispielsweise auf SHA-2 umschaltet. (Ich werde nicht versuchen vorherzusagen, wann das passieren könnte. :-) Es wäre einfacher, Mercurial auf SHA-2 umzustellen, da sie Platz dafür gelassen haben.)Antworten:
Dieser Thread erwähnt:
Oder, wie Ciro Santilli in den Kommentaren vorschlägt :
Oder, wie hier zu sehen , von Colin Schimmelfing :
Ich denke, es ist sicherer, eine Variable mit dem Ergebnis dieses Befehls als Ihren leeren sha1-Baum zu definieren (anstatt sich auf einen "bekannten Wert" zu verlassen).
Hinweis: Git 2.25.1 (Februar 2020) schlägt in Commit 9c8a294 vor :
Und fügt hinzu:
Beachten Sie, dass SHA1 auf einem GitHub-Repo angezeigt wird, wenn der Autor möchte, dass sein erstes Commit leer ist (siehe Blog-Beitrag " Wie ich meine Git-Repositorys initialisiere "):
Werde dir geben:
(Siehe den Baum SHA1?)
Sie können Ihren vorhandenen Verlauf sogar zusätzlich zu diesem leeren Commit neu erstellen (siehe " git: Wie füge ich ein Commit als erstes ein und verschiebe alle anderen? ").
In beiden Fällen verlassen Sie sich nicht auf den genauen SHA1-Wert dieses leeren Baums.
Sie folgen einfach einer bewährten Methode und initialisieren Ihr Repo mit einem ersten leeren Commit .
Das zu tun:
Dadurch wird ein Commit mit einem SHA1 generiert, der für Ihr Repo, Ihren Benutzernamen, Ihre E-Mail-Adresse und Ihr Erstellungsdatum spezifisch ist (was bedeutet, dass der SHA1 des Commits selbst jedes Mal anders ist).
Der Baum, auf den durch dieses Commit verwiesen wird,
4b825dc642cb6eb9a060e54bf8d69288fbee4904
ist jedoch der leere Baum SHA1.So zeigen Sie nur den Baum eines Commits an (zeigen Sie den Commit-Baum SHA1 an):
Wenn dieses Commit, das auf einen leeren Baum verweist, tatsächlich Ihr erstes Commit ist, können Sie diesen leeren Baum SHA1 mit folgendem Befehl anzeigen:
(und das funktioniert sogar unter Windows mit Gnu On Windows- Befehlen)
Wie unten kommentiert ,
git diff <commit> HEAD
zeigt dies mit Ihre gesamte Datei im aktuellen Zweig HEAD an:Hinweis: Dieser leere Baumwert ist formal in definiert
cache.h
.Seit Git 2.16 (Q1 2018) wird es in einer Struktur verwendet, die nicht mehr an (nur) SHA1 gebunden ist, wie in commit eb0ccfd zu sehen :
Weitere Informationen finden Sie unter " Warum verwendet Git kein moderneres SHA? ": Es ist SHA-2 seit Git 2.19 (Q3 2018).
Mit Git 2.25 (Q1 2020) bereiten sich Tests auf einen SHA-2-Übergang vor und beziehen den leeren Baum mit ein.
Sehen Sie verpflichten fa26d5e , begehen cf02be8 , begehen 38ee26b , begehen 37ab8eb , begehen 0370b35 , begehen 0253e12 , begehen 45e2ef2 , begehen 79b0edc , begehen 840624f , begehen 32a6707 , begehen 440bf91 , begehen 0b408ca , begehen 2eabd38 (28. Oktober 2019), und verpflichten 1bcef51 , verpflichten ecde49b ( 05.10.2019 ) von brian m. Carlson (
bk2204
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 28014c1, 10. November 2019)Also
t/oid-info/hash-info
jetzt beinhaltet:Der SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" ist der neue4b825dc642cb6eb9a060e54bf8d69288fbee4904
leere SHA1 " " -Baum.quelle
git diff-tree
einige Skripte zu verwenden, die ich schreibe. Es gibt keine Garantie dafür, dass das Repo ein anfängliches leeres Commit enthält. Ich frage mich nur, ob diese Skripte eines Tages kaputt gehen könnten.-w
an übergebengit hash-object
, wird das Objekt in dem Repository erstellt, für das es ausgeführt wird, und dadurch wird der leere Baum in dem Repository neu erstellt, für das Sie ausgeführt werden, falls es in Zukunft jemals verschwinden sollte./dev/null
:printf '' | git hash-object --stdin -t tree
:)Ich habe einen Blog-Beitrag mit zwei verschiedenen Methoden zum Auffinden des Hash geschrieben: http://colinschimmelfing.com/blog/gits-empty-tree/
Wenn es sich aus irgendeinem Grund jemals ändern sollte, können Sie die beiden folgenden Möglichkeiten verwenden, um es zu finden. Ich würde mich jedoch ziemlich sicher fühlen , wenn ich den Hash in .bashrc-Aliasnamen usw. verwende, und ich glaube nicht, dass sich dies bald ändern wird. Zumindest wäre es wahrscheinlich eine Hauptversion von Git.
Die zwei Möglichkeiten sind:
git hash-object -t tree --stdin < /dev/null
git write-tree
in diesem neuen Repo ausführen - der Hash wird von git write-tree ausgegeben.quelle
–-stdin
ich den Befehl mitfatal: Cannot open '–-stdin': No such file or directory
ausführe, bekomme ich git 2.7.2.--stdin
Wenn Sie es jedoch ohne wie in VonCs Antwort ausführen, erhalten Sie den Hash-WertHier finden Sie die Antwort zum Erstellen eines leeren Baum-Commits, auch wenn das Repository noch nicht leer ist. https://stackoverflow.com/a/14623458/9361507
Aber ich bevorzuge "leer" als Tag, aber keinen Zweig. Einfacher Weg ist:
Weil das Tag ohne Commit direkt auf Tree-ish verweisen kann. Um nun alle Dateien im Arbeitsbaum abzurufen:
Oder das gleiche mit stat:
Alle Dateien als diff:
Überprüfen Sie Leerzeichen in allen Dateien:
quelle
git rev-parse
ginge , hätte ich neue Flags oder Schlüsselwörter oder ähnliches, um (a) den leeren Baum-Hash und (b) den Null-Commit-Hash zu erzeugen. Beides wäre in Skripten nützlich und würde vor den vorgeschlagenen SHA-256-Änderungen schützen.