Können Sie alte Commits von GPG unterzeichnen?

93

Git hat jetzt die Möglichkeit, Commits zu signieren git commit -S, was großartig ist, aber manchmal vergesse ich das Flag für commit, und manchmal maile ich mir Patches, mit denen ich mich bewerbe am, und dieser Befehl hat kein Flag zum Signieren.

Gibt es eine Möglichkeit, einem bereits aufgezeichneten Commit eine Signatur hinzuzufügen?

Magnus
quelle
2
Für die Aufzeichnung können Sie git sagen immer Commits über Konfiguration Zeichen: git config commit.gpgsign true.
Nicooga
@nicooga Ich wünschte, dein Kommentar hätte mehr positive Stimmen, also habe ich das früher bemerkt. Ich musste diese Frage mindestens ein halbes Dutzend Mal stellen, und das Setzen dieser Flagge hätte mir viel Zeit gespart.
Michael Ziluck

Antworten:

78
  1. Wechseln Sie in den interaktiven Rebase-Modus.
  2. Fügen Sie nach jedem Commit, das Sie signieren möchten, die folgende Zeile hinzu

    exec git commit --amend --no-edit -S

Dadurch wird dieser Befehl nach jedem Festschreiben ausgeführt.

AKTUALISIEREN:

Der einfachere Weg dies zu tun ist:

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

Dadurch wird alles bis zur Entwicklung (oder einem beliebigen Hash) neu aufgebaut, und Sie müssen nicht nach jedem Commit Paste kopieren.

Shubham Chaudhary
quelle
Das war genau das, was ich für eine wirklich mühsame Situation brauchte, danke!
Msouth
2
Oh, ich wünschte, ich hätte das früher gefunden. Ich habe so viele Dinge gelesen, sogar von GitHub selbst, und gesagt, dass man alte Commits nicht zurücktreten kann. Dies beweist, dass völlig falsch! Ich hätte Hunderte von Commits sparen können, die ich jetzt gequetscht habe. Na ja ... danke fürs Teilen! Ich habe daraus einen Alias ​​gemacht. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"wirdgit resign HASH
BarryMode
2
Dies sollte allgemein bekannt sein! Du hast einen großartigen Dienst für die Menschheit geleistet (kein Sarg!)!
Hopeseekr
3
Es gibt keinen Grund, etwas zu ändern. Renn einfach git commit --amend --no-edit -n -S.
Quolonel Fragen
9
Ändert dies nicht die Geschichte, die ein erfordert git push --force?
Steve
33

Durch das Signieren eines Commits wird sein Inhalt geändert, sodass neuere Commits je nach Commit den Hash ändern.

Wenn Sie nur das letzte Commit unterschreiben möchten, git commit -S --amendfunktioniert es.

Will Ross
quelle
13

Ich benutze git rebase -i --root(siehe Umschreibeverlauf ) und wechsle pickzu edit.

Dann benutze ich git commit -S --amend --no-edit && git rebase --continue (unter Windows) für jeden Commit.

Dies wird für jedes Commit manuell signiert. Ich hoffe, wir finden eine bessere Lösung.

Illuminator
quelle
Ich habe mein Home-Verzeichnis als Git-Repo (für Dotfiles). Einige Programme nehmen Änderungen interaktiv auf, wenn sie neu basieren. Es ist lustig zu sehen, wie die Geschichte live wiedergegeben wird. Es ist langsam genug, weil das Signieren langsam ist
Avindra Goolcharan
2

Ich bin auch auf das gleiche Problem gestoßen und hier ist meine Lösung:

git rebase -i --root --exec 'git commit --amend --no-edit --no-verify -S'

Dies signiert alle meine Commits vom ersten Commit an und umgeht auch den Commit-Hook , den ich mit husky eingerichtet habe . Keine Notwendigkeit zu ändern , pickzuedit .

DrSensor
quelle
1

Wenn Sie nur bestimmte Commits filtern und nur diese signieren möchten, können Sie Folgendes verwenden filter-branch:

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "[email protected]" ];
  then git commit-tree -S "$@";
  else git commit-tree "$@";
  fi' HEAD

Dies ist nützlich, wenn Sie aus irgendeinem Grund nur Ihre eigenen Commits signieren möchten.

Roberto Leinardi
quelle
0

Wenn Sie alle Festschreibungen von GPG signieren müssen, SEITdem Sie eine bestimmte Festschreibung für den aktuellen Zweig vorgenommen haben, können Sie stattdessen Folgendes verwenden:

git filter-branch --commit-filter 'git commit-tree -S "$@";' <COMMIT>..HEAD

Wo <COMMIT>ist die Festschreibungs-ID (z abc123e5. B. ) ?

Dies hat den zusätzlichen Vorteil, dass die Commit-Metadaten (einschließlich des Commit-Datums) nicht gestört werden.

Wenn Sie nicht mehr bei jedem Commit zur Eingabe Ihrer GPG-Passphrase aufgefordert werden möchten, lesen Sie auch diese Antwort: https://askubuntu.com/a/805550

HINWEIS: Wenn Sie zum Signieren von GIT von gpgauf gpg2wechseln, müssen Sie Ihren privaten Schlüssel in GPG 2 erneut importieren.

GuyPaddock
quelle