it-swarm.com.de

Können Sie alte Commits von GPG unterzeichnen?

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

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

80
Magnus
  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.

66

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 signieren möchten, funktioniert git commit -S --amend.

30
Will Ross

Ich verwende git rebase -i --root (siehe Umschreibungsverlauf ) und pick zu edit.

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

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

10
Illuminator

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 auch den Bypass-Commit-Hook , den ich mit husky eingerichtet habe. Keine Notwendigkeit , pick in edit zu ändern.

2
DrSensor

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

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

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

1

Wenn Sie alle Commits von GPG signieren müssen, SEIT ein bestimmtes Commit für den aktuellen Zweig durchgeführt wurde, können Sie stattdessen Folgendes verwenden:

git filter-branch --commit-filter 'git commit-tree -S "[email protected]";' <COMMIT>..HEAD

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

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 für die GIT-Signatur von gpg zu gpg2 wechseln, müssen Sie Ihren privaten Schlüssel in GPG 2 erneut importieren.

0
GuyPaddock