Git signiert frühere Commits?

Lesezeit: 7 Minuten

Git signiert fruhere Commits
camelCaseD

Ich habe mich gefragt, wie man unterschreibt (-s) aus früheren Commits, die ich in der Vergangenheit in Git gemacht habe?

  • überprüfen schacon.github.com/git/git-commit.html

    – NullPoièteя

    24. Oktober 12 um 5:13 Uhr

  • mögliches Duplikat von stackoverflow.com/questions/1962094/…

    – NullPoièteя

    24. Oktober 12 um 5:13 Uhr

  • Ich frage mich, ob es nicht ironischerweise unsicher ist, dies zu tun. Indem Sie unterschreiben, sagen Sie mehr oder weniger “Ich behaupte, dass die vorherigen Commits sicher sind”. Aber wenn Sie sie geklont haben usw. und diese nicht wirklich überprüfen, geben Sie damit etwas an, das Sie nicht überprüfen können. Stellen Sie sich einen Hacker vor, der irgendwie einen Commit manipuliert. Das Signieren verhindert jedoch tatsächlich, dass man den Commit zu einem späteren Zeitpunkt manipuliert. Aber vielleicht sollten Sie dies der Nachricht hinzufügen?

    – Willem Van Onsem

    12. September 15 um 22:30 Uhr

Git signiert fruhere Commits
fgiraldeau

Verwenden Sie die Änderungsoption, um den vorherigen Commit abzumelden:

git commit --amend --signoff

Bearbeiten: Die Änderung signiert nur den letzten Commit. Um mehrere Commits abzuzeichnen, filter-branch und interpret-trailers wie von vonc et vorgeschlagen. Al. sollte benutzt werden. Hier ist, was für mich funktioniert hat.

Konfigurieren Sie zunächst git, um das Token zu ersetzen sign durch Signed-off-by. Dies muss nur einmal durchgeführt werden und wird im nächsten Schritt benötigt.

git config trailer.sign.key "Signed-off-by"

Der Befehl git filter-branch mit dem Schalter --msg-filter wird den Filter einmal für jeden Commit auswerten. Der Filter kann ein beliebiger Shell-Befehl sein, der die Commit-Nachricht auf stdin empfängt und auf stdout ausgibt. Sie können Ihren eigenen Filter schreiben oder verwenden git interpret-trailers, das ist indepotent. Hier ist ein Beispiel, das die letzten beiden Commits des aktuellen Zweigs unter Verwendung des aktuellen Benutzers und der aktuellen E-Mail abzeichnet:

export SIGNOFF="sign: $(git config --get user.name) <$(git config --get user.email)>"
git filter-branch -f --msg-filter 
    "git interpret-trailers --trailer "$SIGNOFF"" 
     HEAD~2..HEAD

Hinweis 1) Das Ändern von Commit-Nachrichten ändert die Commit-ID, was bedeutet, dass das Überschieben bereits veröffentlichter Branches entweder mit erzwungen werden muss --force oder besser –force-with-lease.

Hinweis 2) Wenn Sie beabsichtigen, Ihr benutzerdefiniertes Skript zu schreiben, beachten Sie dies git filter-branch ändert das aktuelle Verzeichnis in <repo>/.git-rewrite/t. Die Verwendung eines relativen Pfads zum Skript funktioniert normalerweise nicht. Stattdessen sollte sich das Skript in Ihrem befinden $PATH oder als absoluter Pfad bereitgestellt.

  • Könnte a erfordern git push -f.

    – max

    9. Juni 19 um 17:16 Uhr

  • Ich habe versucht, die letzten 6 Commits zu ändern, indem ich zu „HEAD~6..HEAD“ geändert habe, und es hat viel mehr Commits geändert. im Grunde ein Durcheinander

    – Alex Punnen

    14. August 19 um 11:43 Uhr

  • Ich liebe dich und deine Antwort so sehr. Danke, dass Sie mir genau die Befehle gegeben haben, die ich brauchte.

    – SirJames

    10. April 21 um 0:36 Uhr

Probieren Sie diesen aus, um alte Commits mit a zu wiederholen -S:

git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD

Danach müssen Sie git push -f. Aber seien Sie vorsichtig, die Commit-IDs ändern sich und andere Leute werden nicht mehr synchron sein.

  • Dadurch werden ALLE Commits abgemeldet, richtig? Wie melde ich nur die letzten X Commits ab?

    – Akos Vandra-Meyer

    11. Februar 17 um 13:48 Uhr

  • @ÁkosVandra falls du immer noch nach einer Antwort suchst: git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD~X..HEAD, wobei X die Anzahl der letzten X Commits ist. zB für die letzten 2 Commits: git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD~2..HEAD

    – Jashandeep Sohi

    25. April 17 um 4:26 Uhr

  • Was ist, wenn Sie dies nur für MEINE Commits tun, nicht für alle?

    – kerner1000

    7. März 19 um 11:34 Uhr

  • Ich denke, es gibt eine leichte Verwirrung, Kapital -S ist für GPG-sign commit, ich denke, dass das OP niedriger gemeint ist -s einfach hinzufügen Sign-off-by Zeile am Ende der Commit-Nachricht.

    – fgiraldeau

    10. Juni 19 um 20:16 Uhr

Git signiert fruhere Commits
Schubert

Heutzutage (beginnend mit Git2.13) können Sie im Allgemeinen so etwas tun

git rebase --signoff HEAD~2

hinzufügen Signed-off-by Fußzeilen zu den letzten 2 Commits (in diesem Beispiel).

Wenn Ihr Bereich das Root-Commit enthält, fügen Sie die hinzu --root Option zu rebase.

  • Ich habe es gerade getestet und dies hatte den gleichen Effekt wie die anderen vorgeschlagenen Antworten. Um jeden Commit abzumelden, ersetzen Sie HEAD~2 durch den Hash des ersten Commit.

    – Fantom

    13. April 21 um 2:53 Uhr

  • Das sollte irgendwie nach oben kommen

    – Yaniv K.

    25. April 21 um 6:34 Uhr

  • Zu unterschreiben verpflichtet sich, zu 100% überprüfbar zu sein git rebase --signoff -S HEAD~2

    – Dzmitri Lahoda

    Vor 2 Tagen

Falls noch jemand nach einer besser automatisierten Methode zum Abmelden von Commits sucht.

Versuche dies:

git rebase --exec 'git commit --amend --no-edit -n -S' -i commit-hash

Dies wird alles bis zum Commit-Hash (X Commits) rebasen.

Dann git push -f ist erforderlich, um die Änderung im Verlauf zurück auf die Fernbedienung zu verschieben

1643906289 832 Git signiert fruhere Commits
Varun Garg

Für mich hat das Ändern von Signof meine Commits auf Github nicht wirklich überprüft.

Die Lösung, die für mich funktioniert hat, geht zurück und signiert dann jedes Commit mit -S

git commit --amend -S

Verwenden Sie diesen Befehl auch, wenn Sie überprüfen, ob Ihr Commit tatsächlich signiert ist und Ihre E-Mail-Adresse / Ihr Name einfach nicht angehängt ist

git show HEAD --show-signature

Extra-Tipp: Wenn Sie Ihre Commits bereits ändern, möchten Sie möglicherweise Ihren richtigen Namen darin verwenden (siehe using git log). Möglicherweise verwenden Sie Ihren Github-Handle-Namen, der nicht erforderlich ist. Es wird nur eine korrekte E-Mail-Adresse benötigt, und im Feld des Benutzernamens sollten Sie Ihren vollständigen Namen verwenden, und github wird ihn korrekt mit Ihrem Github-Handle-Namen verfolgen. Um also Ihren Benutzernamen zu korrigieren und den letzten Commit zu signieren, verwenden Sie:

git commit --amend --author="FULL NAME <email>" -S

und setzen Sie auch den vollständigen Namen für den Benutzernamen in Zukunft um

git config --global user.name "FULL NAME"

Unter Berücksichtigung von Abmeldungen ändern Sie die Commit-Nachricht, verwendet git filter-branch um das zu erreichen.

git filter-branch --msg-filter 
    "cat - && echo && echo 'Signed-off-by: Dan McGee <[email protected]>'" 
    HEAD

(Beispiel aus “git filter-branch Magie“)

Oder, dem Vorschlag von Curt J. Sampson folgend, using git interpret-trailers:

git config trailer.sign.key "Signed-off-by"
git filter-branch --msg-filter 
    "cat - && echo && git interpret-trailers --trailer 'sign: 'Signed-off-by: Dan McGee <[email protected]>'" 
    HEAD

Vorbehalt: Dadurch wird der SHA1 Ihrer vorhandenen Commits geändert, und Sie müssen möglicherweise das Push-Ergebnis erzwingen, was problematisch sein kann, wenn Ihre Commits bereits von anderen geteilt werden.

Vorburger fügt im Kommentar ein Beispiel hinzu:

Bei der Git-Version 2.20.1 musste ich “Signed-off-by” in --trailer 'sign:und mach es so:

git filter-branch --msg-filter 
  "cat - && echo && git interpret-trailers --trailer 'sign: Michael Vorburger <[email protected]>'" 
  HEAD

Eine interaktive Rebase mit dem -S Flagge wird die Arbeit erledigen.

Nehmen wir an, Sie müssen den letzten abmelden n Commits (stellen Sie sicher, dass Sie die neuesten davon auschecken n begeht).

Lauf:

$ git rebase -S -i HEAD~n

# The `-S` flag is important.
# It tells Git to sign the following commits.

Dies gibt eine Liste der letzten n begeht.

Jetzt ändern pick zu edit Präfix für alle Commits, die Sie signieren möchten.

Wenn Sie fertig sind, schließen Sie den Editor. Es öffnet sich ein neuer Editor mit allem über den Commit.

Da im Commit nichts geändert werden muss, speichern Sie die Datei und beenden Sie den Editor. Sie können die Commit-Nachricht auch ändern, während Sie gerade dabei sind.

Wiederholen Sie dies für andere Commits.

Um den neuesten Verlauf zu pushen, git push remote branch -f.

Warnung

Es gibt einen Haken – es kann Ihre Commits umschreiben.

Wenn Sie ein 4 Monate altes Commit signieren, überschreibt es möglicherweise sein Datum und lässt es so aussehen, als wäre es heute erstellt worden. Daher nicht empfohlen, wenn Sie Ihren Commit-Verlauf aufbewahren möchten.

.

757590cookie-checkGit signiert frühere Commits?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy