Ich versuche hier ein ausgefallenes Zeug mit Git-Hooks zu machen, aber ich weiß nicht wirklich, wie ich es machen soll (oder ob es möglich ist).
Was ich tun muss, ist: In jedem Commit möchte ich seinen Hash nehmen und dann eine Datei im Commit mit diesem Hash aktualisieren.
Irgendwelche Ideen?
Antworten:
Ich würde empfehlen, etwas Ähnliches zu tun, wie Sie es sich vorgestellt haben: Platzieren des SHA1 in einer nicht verfolgten Datei, die im Rahmen des Erstellungs- / Installations- / Bereitstellungsprozesses generiert wird. Es ist offensichtlich einfach zu tun (
git rev-parse HEAD > filename
oder vielleichtgit describe [--tags] > filename
) und es vermeidet es, etwas Verrücktes zu tun, wie eine Datei zu erhalten, die sich von der Verfolgung durch Git unterscheidet.Ihr Code kann dann auf diese Datei verweisen, wenn er die Versionsnummer benötigt, oder ein Erstellungsprozess kann die Informationen in das Endprodukt integrieren. Letzteres ist tatsächlich, wie Git selbst seine Versionsnummern erhält - der Erstellungsprozess holt die Versionsnummer aus dem Repo und baut sie dann in die ausführbare Datei ein.
quelle
Es ist unmöglich, den aktuellen Commit-Hash zu schreiben: Wenn Sie den zukünftigen Commit-Hash vorberechnen können, ändert sich dieser, sobald Sie eine Datei ändern.
Es gibt jedoch drei Möglichkeiten:
pre-commit
speichern die vorherigen Hash begehen :) Sie nicht ändern / Insert - Commits in 99,99% der Fälle, so, dies funktionieren wird. Im schlimmsten Fall können Sie die Quellrevision immer noch identifizieren.Ich arbeite an einem Hook-Skript, werde es hier veröffentlichen, wenn es fertig ist, aber immer noch - früher als Duke Nukem Forever veröffentlicht wird :))
Update : Code für
.git/hooks/pre-commit
:Jetzt brauchen wir nur noch ein Tool, das
prev_commit,branch
Paare in einen echten Commit-Hash konvertiert :)Ich weiß nicht, ob dieser Ansatz das Zusammenführen von Commits voneinander unterscheiden kann. Werde es bald überprüfen
quelle
Jemand hat mich auf den Abschnitt "man gitattributes" auf ident hingewiesen, der Folgendes enthält:
ident
Wenn Sie darüber nachdenken, ist dies auch das, was CVS, Subversion usw. tun. Wenn Sie sich das Repository ansehen, werden Sie feststellen, dass die Datei im Repository immer beispielsweise $ Id $ enthält. Es enthält nie die Erweiterung davon. Nur beim Auschecken wird der Text erweitert.
quelle
ident
ist der Hash für die Datei selbst, nicht der Hast des Commits. Von git-scm.com/book/en/… : "Dieses Ergebnis ist jedoch von begrenztem Nutzen. Wenn Sie die Schlüsselwortersetzung in CVS oder Subversion verwendet haben, können Sie einen Datenstempel einfügen - der SHA ist nicht allzu hilfreich. weil es ziemlich zufällig ist und man nicht sagen kann, ob ein SHA älter oder neuer als ein anderer ist. "filter
nimmt Arbeit in Anspruch, kann aber die Festschreibungsinformationen in eine Datei (und aus dieser heraus) übertragen.Dies kann erreicht werden, indem das
filter
Attribut in gitattributes verwendet wird . Sie müssten einensmudge
Befehl angeben, der die Festschreibungs-ID einfügt, und aclean
Befehl, der sie entfernt, sodass sich die Datei, in die sie eingefügt wird, nicht nur aufgrund der Festschreibungs-ID ändert.Daher wird die Festschreibungs-ID niemals im Blob der Datei gespeichert. Es ist nur in Ihrer Arbeitskopie erweitert. (Das Einfügen der Commit-ID in den Blob wird zu einer unendlich rekursiven Aufgabe. ☺) Jeder, der diesen Baum klont, muss die Attribute für sich selbst einrichten.
quelle
Denken Sie außerhalb des Commit-Bereichs!
Pop dies in die Datei Hooks / Post-Checkout
Die Version ist überall verfügbar, wo Sie sie verwenden.
quelle
Ich glaube nicht, dass Sie das wirklich tun möchten, denn wenn eine Datei im Commit geändert wird, wird auch der Hash des Commits geändert.
quelle
Lassen Sie mich anhand der Git-Interna untersuchen, warum dies ein herausforderndes Problem ist. Sie können den sha1 des aktuellen Commits von abrufen
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.
quelle