Alors quelqu'un a révisé mon travail par des pairs, et il m'a dit que je devrais toujours signer mes commits et mes tags cryptographiquement. Lorsqu'on lui a demandé pourquoi, il n'a pas su m'expliquer et m'a répondu "C'est juste une bonne chose à faire".
Essayer d'éviter une évidence scénario chimpanzé , pourquoi devrais-je vraiment? Y a-t-il vraiment autant d'avantages distincts et aucun inconvénient?
Quelles sont les raisons pratiques qui me donneraient envie de signer chaque commit et tag que je fais?
(Ceci est largement basé sur A Git Horror Story: Repository Integrity With Signed Commits - une très bonne lecture et plus d'informations que je ne pourrais mettre dans une réponse.)
Il existe un certain nombre de façons dont un référentiel git peut être compromis (ce n'est pas une faille de sécurité, juste une réalité - il ne faut pas éviter d'utiliser git à cause de cela). Par exemple, quelqu'un peut avoir poussé vers votre référentiel prétendant être vous. Ou d'ailleurs, quelqu'un aurait pu pousser vers le référentiel de quelqu'un d'un autre prétendant être vous (quelqu'un pourrait pousser vers son propre référentiel prétendant être vous aussi). Cela fait partie de la vie dans un DVCS.
À titre d'exemple:
$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email [email protected]
Là, j'ai changé ma configuration git pour prétendre que je suis toi. Et maintenant, je peux m'engager et laisser ces validations faire leur chemin dans la génération de production, et il semble que vous l'ayez fait.
Avec la signature des validations (et des balises), on peut prouver que certaines validations et balises viennent de vous (et les choses qui ne sont pas signées n'auraient pas dû entrer dans la version de production). C'est vraiment la clé de tout cela: en signant des engagements, vous dites que c'est votre travail.
L'aspect "votre travail" est particulièrement important dans le noyau linux (et donc git) qui est occasionnellement frappé par des poursuites pour droit d'auteur. En signant des commits, vous dites que vous avez droit au logiciel — il suit l'origine. Il se peut que vous n'ayez pas accès à la source qui est revendiquée en tant que droit d'auteur et que la revendication est sans fondement. Il se peut que la société ait oublié que vous travailliez pour eux il y a quelques années et sous leur direction a ajouté du matériel au noyau, ou autre.
Il y a un débat quant à savoir si chaque engagement doit être signé. De GPG signant pour git commit? (de retour en '09), Linus a écrit:
Signer chaque commit est totalement stupide. Cela signifie simplement que vous l'automatisez et que vous faites que la signature vaut moins. Cela n'ajoute pas non plus de valeur réelle, puisque la façon dont fonctionne la chaîne DAG git du SHA1, vous n'avez besoin que d'une seule signature pour que tous les commits accessibles à partir de celle-ci soient effectivement couverts par celle-ci. Donc, la signature de chaque commit manque simplement le point.
Vous pouvez également lire beaucoup plus sur les réflexions sur la connexion à git.
Cela dit, il a tout de même fait son chemin dans git.
Il semble y avoir un consensus majoritaire selon lequel la signature des validations n'est pas nécessaire, mais la signature des balises est très bonne. Ce billet de blog lié en haut suggère que l'on devrait tout signer de toute façon. Comme je l'ai dit, il y a un débat pour savoir si chaque engagement est nécessaire ou non.
La clé du débat "signer chaque commit" a probablement à voir avec le workflow que vous utilisez. La plupart des gens font un tas de commits dans leur dépôt local, puis poussent cet ensemble. Il devrait être suffisant de baliser la collection finale (en supposant que vous vous assurez que toutes les modifications sont correctes). Si vous travaillez dans un environnement où de nombreuses validations individuelles se déplacent, la distinction entre une balise et une validation devient moins… distincte — et la signature des validations peut devenir plus utile.