Lassen Sie mich anhand der Git-Interna untersuchen, warum dies ein herausforderndes Problem ist. Sie können den sha1 des aktuellen Commits von abrufen
#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s\0" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}
Im Wesentlichen führen Sie eine sha1-Prüfsumme für die von zurückgegebene Nachricht aus git cat-file commit HEAD
. Zwei Dinge treten sofort als Problem auf, wenn Sie diese Nachricht untersuchen. Einer ist der Baum sha1 und der zweite ist die Festschreibungszeit.
Jetzt kann die Festschreibungszeit leicht behoben werden, indem die Nachricht geändert und erraten wird, wie lange es dauert, eine Festschreibung durchzuführen oder eine Festschreibung zu einem bestimmten Zeitpunkt zu planen. Das wahre Problem ist der Baum sha1, von dem Sie erhalten können git ls-tree $(git write-tree) | git mktree
. Im Wesentlichen führen Sie eine sha1-Prüfsumme für die Nachricht von ls-tree durch, bei der es sich um eine Liste aller Dateien und ihrer sha1-Prüfsumme handelt.
Daher hängt Ihre Commit-sha1-Prüfsumme von Ihrer Baum-sha1-Prüfsumme ab, die direkt von der Datei sha1-Prüfsumme abhängt, die den Kreis schließt und von der Commit-sha1 abhängt. Sie haben also ein zirkuläres Problem mit Techniken, die mir zur Verfügung stehen.
Mit weniger sicheren Prüfsummen wurde gezeigt, dass es möglich ist, die Prüfsumme der Datei mit brutaler Gewalt in die Datei selbst zu schreiben. Ich kenne jedoch keine Arbeit, die diese Aufgabe mit sha1 erfüllt hat. Dies ist nicht unmöglich, aber nach unserem derzeitigen Verständnis nahezu unmöglich (aber wer weiß, dass es in ein paar Jahren vielleicht trivial sein wird). Dies ist jedoch noch schwieriger zu erzwingen, da Sie die (Commit-) Prüfsumme einer (Baum-) Prüfsumme einer (Blob-) Prüfsumme in die Datei schreiben müssen.