git - generation - gpg windows
¿Hay alguna forma de "autosignar" commits en Git con una clave GPG? (5)
Debe dejar en claro que si firma un compromiso o una etiqueta, no quiere decir que aprueba toda la historia. En caso de confirmaciones, solo debe firmar el cambio en cuestión, y en el caso de la etiqueta, bien ... debe definir a qué se refiere. Es posible que hayas realizado un cambio que diga que es de ti, pero no lo fue (porque alguien más lo presionó hacia tu control remoto). O es un cambio en el que no quiere estar, pero acaba de firmar la etiqueta.
En los proyectos típicos de OSS, esto podría ser menos común, pero en un escenario empresarial donde solo se toca código de vez en cuando y no se lee todo el historial, puede pasar inadvertido.
La firma de confirmaciones es un problema si se las cambiará a otros padres. Pero sería bueno si un compromiso modificado pudiera apuntar al compromiso "original" que realmente verifica.
¿Hay alguna manera fácil de hacer que Git siempre firme cada confirmación o etiqueta que se crea?
Lo intenté con algo como:
alias commit = commit -S
Pero eso no funcionó.
No quiero instalar un programa diferente para que esto suceda. ¿Es factible con facilidad?
Solo una pregunta complementaria, quizás las confirmaciones no se deben firmar, solo las etiquetas, que nunca creo, ya que envío confirmaciones únicas para un proyecto como Homebrew, etc.
Editar: A partir de la versión 1.7.9 de Git, es posible firmar confirmaciones de Git ( git commit -S
). Actualizando la respuesta ligeramente para reflejar esto.
El título de la pregunta es:
¿Hay alguna forma de "autosignar" commits en Git con una clave GPG?
Respuesta corta: sí, pero no lo hagas.
Abordar el error tipográfico en la pregunta: git commit -s
no firma el compromiso. Más bien, desde la página man git-commit
:
-s, --signoff
Añada la línea Firmado por el committer al final del mensaje de registro de confirmación.
Esto proporciona un resultado de registro similar al siguiente:
± $ 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
Tenga en cuenta el bit "Signed-off-by: ..."; eso fue generado por el indicador -s
en el git-commit
.
Citando el correo electrónico del anuncio de lanzamiento :
- "git commit" aprendió "-S" a GPG-firmar el commit; esto se puede mostrar con la opción "--show-signature" en "git log".
Entonces, sí, puedes firmar commits. Sin embargo, yo personalmente pido cautela con esta opción; firmar automáticamente commits es inútil, ver a continuación:
Solo una pregunta secundaria, quizás las confirmaciones no se deben firmar, solo las etiquetas, que nunca creo, ya que envío confirmaciones únicas.
Eso es correcto. Los compromisos no están firmados; las etiquetas son La razón de esto se puede encontrar en este mensaje de Linus Torvalds , cuyo último párrafo dice:
Firmar cada commit es totalmente estúpido. Simplemente significa que lo automatizas y haces que la firma valga menos. Tampoco agrega ningún valor real, ya que por la forma en que funciona la cadena de DAG de git de SHA1, solo necesita una firma para hacer que todas las confirmaciones alcanzables desde esa estén efectivamente cubiertas por esa. Entonces, firmar cada compromiso es simplemente perder el punto.
Animaría a examinar el mensaje vinculado, lo que aclara por qué la firma de commits automáticamente no es una buena idea de una manera mucho mejor que la que podía.
Sin embargo , si desea firmar automáticamente una etiqueta , podría hacerlo envolviendo la git-tag -[s|u]
en un alias; Si va a hacer eso, probablemente desee configurar su ID de clave en ~/.gitconfig
o el archivo .git/config
específico del proyecto. Se puede ver más información sobre ese proceso en el libro de la comunidad git . Firmar etiquetas es infinitamente más útil que firmar cada confirmación que realices.
Nota: si no desea agregar -S
todo el tiempo para asegurarse de que sus confirmaciones estén firmadas, hay una propuesta ('' pu
'' de rama por ahora, diciembre de 2013, por lo que no hay garantía de que llegue a una versión de git) para agregar una configuración que se encargará de esa opción por usted.
Actualización de mayo de 2014: está en Git 2.0 (después de ser reenviado en esta serie de parches )
Ver commit 2af2ef3 por Nicolas Vigier (boklm) :
Agregue la opción commit.gpgsign
para firmar todas las confirmaciones
Si desea que GPG firme todas sus confirmaciones, debe agregar la opción
-S
todo el tiempo.
La opción de configuracióncommit.gpgsign
permite firmar todas las confirmaciones automáticamente.
commit.gpgsign
Un booleano para especificar si todas las confirmaciones deben estar firmadas por GPG.
El uso de esta opción al realizar operaciones como rebase puede dar como resultado la firma de un gran número de confirmaciones. Puede ser conveniente usar un agente para evitar escribir su frase de contraseña GPG varias veces.
Esa configuración generalmente se establece por repositorio (no es necesario que firme sus repositorios locales experimentales privados):
cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true
Combinaría eso con user.signingKey
usado como una configuración global (clave única utilizada para todo el repositorio en el que desea firmar commit)
git config --global user.signingkey F2C7AB29
user.signingKey
se introdujo en git 1.5.0 (enero de 2007) con commit d67778e :
No debería haber un requisito de que use la misma forma de mi nombre en mi repositorio git y mi clave gpg.
Además, podría tener varias llaves en mi llavero, y podría querer usar una que no coincida con la dirección que uso en los mensajes de confirmación.Este parche agrega una entrada de configuración "
user.signingKey
" que, si está presente, se pasará al conmutador "-u" para gpg, lo que permite anular la clave de firma de etiqueta.
Esto se aplica con la confirmación aba9119 (git 1.5.3.2) para detectar el caso en el que Si el usuario ha configurado user.signingKey
en su .git/config
o simplemente no tiene ninguna clave secreta en su llavero.
Notas:
- Por convención, desde git 2.4.0 de marzo de 2015 , es
signingKey
, nosigningkey
, aunque las claves degit config
distinguen entre mayúsculas y minúsculas. Eso solo importaría si hacesgit config --get-regexp
, quegit config --get-regexp
mayúsculas y minúsculas, de lo contrario, es solo una convención de legibilidad; - Si desea que el servidor de git compruebe la firma de cada inserción , necesitará git 2.2+ (octubre de 2014) como mínimo ( confirmación b945901 ), ya que
git push --signed
no consideró el valor de configuración deuser.signingKey
; - git 2.9 (junio de 2016) utilizará
user.signingKey
para forzar la firma de las etiquetas anotadas, así como las confirmaciones: commit 61c2fe0 .
Para hacer que la firma automática trabaje en la versión 2.0, tendrá que agregar git alias para commit.
# git config --global alias.commit commit -S
[alias]
commit = commit -S
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true
Reemplace 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 por su identificación de clave. Recuerde: nunca es una buena idea usar la identificación corta .
ACTUALIZACIÓN: según un nuevo edicto de git , todas las claves de configuración deben estar en camelCase.