web-dev-qa-db-fra.com

Existe-t-il un moyen de "signer automatiquement" des commits dans Git avec une clé GPG?

Existe-t-il un moyen simple de faire en sorte que Git signe systématiquement chaque commit ou tag créé?

Je l'ai essayé avec quelque chose comme:

alias commit = commit -S

Mais ça n'a pas fait l'affaire.

Je ne veux pas installer un programme différent pour y arriver. Est-ce faisable avec facilité?

Juste une question secondaire, peut-être que les commits ne devraient pas être signés, mais uniquement des balises, que je ne crée jamais, car je soumets des commits simples pour un projet comme Homebrew, etc.

192
MindTooth

Remarque: si vous ne souhaitez pas ajouter -S À tout moment pour vous assurer que vos validations sont signées, il existe une proposition (branche 'pu' pour le moment, décembre 2013, donc aucune garantie. cela fera une version git) d’ajouter une config qui se chargera de cette option pour vous.
Mise à jour de mai 2014: il est dans Git 2.0 (après avoir été renvoyé dans cette série de correctifs )

Voir commit 2af2ef par Nicolas Vigier (boklm) :

Ajoutez l'option commit.gpgsign Pour signer tous les commits

Si vous voulez signer tous vos commits par GPG, vous devez ajouter l’option -S Tout le temps.
L'option de configuration commit.gpgsign Permet de signer automatiquement toutes les validations.

commit.gpgsign

Un booléen pour spécifier si tous les commits doivent être signés par GPG.
L'utilisation de cette option lors d'opérations telles que rebase peut entraîner la signature d'un grand nombre de validations. Il peut être pratique d’utiliser un agent pour éviter de saisir plusieurs fois votre phrase secrète GPG.


Cette configuration est généralement définie par dépôt (vous n'avez pas besoin de signer votre dépôt local expérimental privé):

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

Vous combineriez cela avec user.signingKey Utilisé comme paramètre global (clé unique utilisée pour tous les dépôts avec lesquels vous voulez signer la validation)

git config --global user.signingkey F2C7AB29

user.signingKey A été introduit dans git 1.5.0 (janvier 2007) avec commit d67778e :

Il ne devrait pas être obligatoire que j'utilise le même formulaire de mon nom dans mon référentiel git et ma clé gpg.
De plus, mon trousseau de clés peut contenir plusieurs clés et en utiliser une qui ne correspond pas à l'adresse que j'utilise dans les messages de validation.

Ce correctif ajoute une entrée de configuration "user.signingKey" Qui, si elle est présente, sera transmise au commutateur "-u" pour gpg, ce qui permettra de remplacer la clé de signature de balise.

Ceci est appliqué avec commit aba9119 (git 1.5.3.2) pour intercepter le cas où l'utilisateur a mal configuré user.signingKey Dans son .git/config Ou ne le fait pas avoir des clés secrètes sur leur trousseau.

Remarques:

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

Remplacez 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 par votre clé. Rappelez-vous: Ce n'est jamais une bonne idée d'utiliser l'identifiant court .

UPDATE: Per n nouvel édit Git , toutes les clés de configuration doivent être dans camelCase.

150
Felipe

Edit: Depuis la version 1.7.9 de Git, il est possible pour signer les commits Git (git commit -S). Mise à jour légèrement la réponse pour refléter cela.

Le titre de la question est:

Existe-t-il un moyen de "signer automatiquement" des commits dans Git avec une clé GPG?

Réponse courte: oui, mais ne le fais pas.

Aborder la faute de frappe dans la question: git commit -s ne signe pas le commit. Plutôt, du man git-commit page:

-s, --signoff
Ajouter une ligne déconnectée par le commetteur à la fin du message du journal de validation.

Cela donne une sortie de journal semblable à celle-ci:


± $ 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 

Notez le bit "Signed-off-by: ..."; qui a été généré par le -s drapeau sur le git-commit.

Citant le email de l'annonce de publication :

  • "git commit" appris "-S" pour GPG-signer le commit; cela peut être montré avec l'option "--show-signature" à "git log".

Alors oui, vous pouvez signer des commits. Cependant, j’encourage personnellement la prudence avec cette option; automatiquement signer commet est presque inutile, voir ci-dessous:

Juste une question secondaire, peut-être que les commits ne devraient pas être signés, mais uniquement des balises, que je ne crée jamais, car je soumets des commits simples.

C'est correct. Les commits ne sont pas signés; les balises sont. La raison de ceci peut être trouvée dans ce message par Linus Torvalds , dont le dernier paragraphe dit:

Signer chaque commit est totalement stupide. Cela signifie simplement que vous l'automatisez et que vous donnez moins de valeur à la signature. Cela n'ajoute pas non plus de réelle valeur, puisque la manière dont la chaîne de travail de SHA1 de git DAG est enchaînée n'a besoin que de la signature une pour que tous les commits accessibles de celui-ci soient effectivement couverts par celui-là. Donc, signer chaque commit est tout simplement ce qui manque.

J'encouragerais une navigation dans le message lié, ce qui clarifie pourquoi la signature automatique des commits n'est pas une bonne idée d'une bien meilleure façon que je ne le pourrais.

Cependant , si vous voulez signer automatiquement un tag, vous pourrez le faire en encapsulant le git-tag -[s|u] dans un alias; si vous voulez faire cela, vous voudrez probablement configurer votre identifiant de clé dans ~/.gitconfig ou le projet spécifique .git/config fichier. Plus d'informations sur ce processus sont disponibles dans git community book . La signature des tags est infiniment plus utile que la signature de chaque commit que vous faites.

48
simont

Pour que la signature automatique fonctionne avant la version 2.0, vous devez ajouter git alias for commit.

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

Vous devez préciser que si vous signez un commit ou une balise, cela ne signifie pas que vous approuvez l'historique complet. En cas de validation, vous ne faites que signer le changement en main, et en cas de tag, eh bien, vous devez définir ce que vous voulez dire. Vous avez peut-être retiré un changement qui prétend l'avoir été mais ne l'a pas été (parce que quelqu'un d'autre l'a poussé vers votre télécommande). Ou c'est un changement dans lequel vous ne voulez pas être, mais vous venez de signer le tag.

Cela est peut-être moins courant dans les projets OSS classiques, mais dans un scénario d'entreprise où vous ne touchez le code que de temps en temps et que vous ne lisez pas tout l'historique, cela risque de passer inaperçu.

Signer les commits est un problème s’ils doivent être rebasés ou cueillis à d’autres parents. Mais il serait bon qu’un commit modifié puisse pointer vers le commit "original" qui vérifie réellement.

0
eckes