wake-up-neo.com

Gibt es eine Möglichkeit, Commits in Git mit einem GPG-Schlüssel automatisch zu signieren?

Gibt es eine einfache Möglichkeit, Git immer dazu zu bringen, jedes erstellte Commit oder Tag zu signieren?

Ich habe es mit etwas versucht:

alias commit = commit -S

Aber das hat nicht geholfen.

Ich möchte kein anderes Programm installieren, um dies zu ermöglichen. Ist es mit Leichtigkeit machbar?

Nur eine Nebenfrage, vielleicht sollten Commits nicht signiert werden, nur Tags, die ich nie erstelle, da ich einzelne Commits für ein Projekt wie Homebrew usw. einreiche.

192
MindTooth

Hinweis: Wenn Sie nicht ständig -S Hinzufügen möchten, um sicherzustellen, dass Ihre Commits signiert sind, gibt es für Dezember 2013 einen Vorschlag (Zweig 'pu'), daher keine Garantie es wird zu einem Git-Release kommen, um eine Konfiguration hinzuzufügen, die diese Option für Sie erledigt.
Update Mai 2014: Es ist in Git 2.0 (nachdem in dieser Patch-Serie erneut gesendet )

Siehe commit 2af2ef von Nicolas Vigier (boklm) :

Fügen Sie die Option commit.gpgsign Hinzu, um alle Commits zu signieren

Wenn Sie möchten, dass GPG alle Commits signiert, müssen Sie immer die Option -S Hinzufügen.
Mit der Konfigurationsoption commit.gpgsign Können alle Commits automatisch signiert werden.

commit.gpgsign

Ein Boolescher Wert, der angibt, ob alle Commits GPG-signiert sein sollen.
Die Verwendung dieser Option bei Vorgängen wie "Rebase" kann dazu führen, dass eine große Anzahl von Commits unterzeichnet wird. Es kann zweckmäßig sein, einen Agenten zu verwenden, um zu vermeiden, dass Sie Ihre GPG-Passphrase mehrmals eingeben.


Diese Konfiguration wird normalerweise pro Repo festgelegt (Sie müssen Ihre privaten experimentellen lokalen Repos nicht signieren):

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

Sie würden das mit user.signingKey Kombinieren, das als globale Einstellung verwendet wird (eindeutiger Schlüssel, der für alle Repos verwendet wird, in denen Sie ein Commit signieren möchten).

git config --global user.signingkey F2C7AB29

user.signingKey Wurde in git 1.5.0 (Jan. 2007) mit commit d67778e eingeführt:

Es sollte nicht erforderlich sein, dass ich die gleiche Form meines Namens in meinem Git-Repository und meinem GPG-Schlüssel verwende.
Außerdem habe ich möglicherweise mehrere Schlüssel in meinem Schlüsselbund und möchte möglicherweise einen verwenden, der nicht mit der Adresse übereinstimmt, die ich in Commit-Nachrichten verwende.

Dieser Patch fügt einen Konfigurationseintrag "user.signingKey" Hinzu, der, falls vorhanden, an den Schalter "-u" für gpg übergeben wird, sodass der Tag-Signaturschlüssel überschrieben werden kann.

Dies wird mit commit aba9119 (git 1.5.3.2) erzwungen, um den Fall zu erfassen, dass der Benutzer user.signingKey In seinem .git/config Falsch konfiguriert hat oder dies einfach nicht tut Habe geheime Schlüssel am Schlüsselbund.

Anmerkungen:

241
VonC
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

Ersetzen Sie 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 durch Ihre Schlüssel-ID. Denken Sie daran: Es ist nie eine gute Idee, die kurze ID zu verwenden .

UPDATE: Per neuer Git-Erlass sollten sich alle Konfigurationsschlüssel in camelCase befinden.

150
Felipe

Edit: Ab Git Version 1.7.9 ist es is möglich Git Commits zu signieren (git commit -S). Aktualisieren Sie die Antwort leicht, um dies widerzuspiegeln.

Der Fragentitel lautet:

Gibt es eine Möglichkeit, Commits in Git mit einem GPG-Schlüssel automatisch zu signieren?

Kurze Antwort: Ja, aber tu es nicht.

Wenn Sie den Tippfehler in der Frage git commit -s Ansprechen, wird das Commit nicht signiert. Eher von der man git-commit Seite:

-s, --signoff
Fügen Sie die vom Committer abgemeldete Zeile am Ende der Commit-Protokollnachricht hinzu.

Dies ergibt eine Protokollausgabe ähnlich der folgenden:


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

Beachten Sie das Bit "Abgemeldet von: ...". Dies wurde durch das Flag -s auf dem git-commit generiert.

Zitieren der Release Ankündigung E-Mail :

  • "git commit" hat "-S" gelernt, um das Commit durch GPG zu signieren; Dies kann mit der Option "--show-signature" in "git log" angezeigt werden.

Sie können also Commits unterzeichnen. Ich persönlich rate jedoch zur Vorsicht bei dieser Option. automatisch Commits zu signieren ist so gut wie sinnlos, siehe unten:

Nur eine Nebenfrage, vielleicht sollten Commits nicht signiert werden, sondern nur Tags, die ich nie erstelle, wenn ich einzelne Commits einreiche.

Das ist richtig. Commits sind nicht signiert. Tags sind. Der Grund dafür ist in dieser Nachricht von Linus Torvalds zu finden, in dessen letztem Absatz steht:

Es ist total dumm, jedes Commit zu unterschreiben. Es bedeutet nur, dass Sie es automatisieren und die Signatur weniger wert ist. Es bringt auch keinen wirklichen Mehrwert, da die Arbeitsweise der git-DAG-Kette von SHA1 immer nur eine one Signatur benötigt, um alle von dieser erreichbaren Commits effektiv abzudecken Das hier. Wenn Sie also jedes Commit unterschreiben, kommt es einfach nicht darauf an.

Ich würde ein Durchsuchen der verknüpften Nachricht empfehlen, um zu verdeutlichen, dass warum das automatische Signieren von Commits in weitaus besserer Weise keine gute Idee ist als ich.

Wenn Sie jedoch automatisch ein Tag signieren möchten, können Sie dies tun, indem Sie das git-tag -[s|u] In einem Alias; In diesem Fall möchten Sie wahrscheinlich Ihre Schlüssel-ID in ~/.gitconfig oder der projektspezifischen .git/config - Datei einrichten. Weitere Informationen zu diesem Vorgang finden Sie im Git-Community-Buch . Das Signieren von Tags ist weitaus nützlicher als das Signieren jedes von Ihnen getätigten Commits.

48
simont

Damit das automatische Signieren vor Version 2.0 von git funktioniert, müssen Sie einen git-Alias ​​für das Festschreiben hinzufügen.

# git config --global alias.commit commit -S
[alias]
    commit = commit -S
5

Sie müssen klarstellen, dass Sie nicht den gesamten Verlauf genehmigen, wenn Sie ein Commit oder ein Tag signieren. Im Falle von Commits unterschreiben Sie nur die vorliegende Änderung, und im Falle von Tag müssen Sie definieren, was Sie damit meinen. Möglicherweise haben Sie ein Wechselgeld gezogen, von dem behauptet wird, dass es von Ihnen stammt, dies aber nicht war (weil es von einem anderen Benutzer an Ihre Fernbedienung gesendet wurde). Oder es ist eine Änderung, an der Sie nicht teilnehmen möchten, aber Sie haben gerade das Tag signiert.

In typischen OSS-Projekten ist dies möglicherweise weniger verbreitet, aber in einem Unternehmensszenario, in dem Sie nur ab und zu Code berühren und nicht den gesamten Verlauf lesen, wird dies möglicherweise unbemerkt.

Das Unterschreiben von Commits ist ein Problem, wenn sie anderen Eltern zur Seite gestellt oder von ihnen geerntet werden. Es wäre jedoch gut, wenn ein modifizierter Commit auf den "ursprünglichen" Commit verweisen könnte, der tatsächlich überprüft.

0
eckes