¿Puedes GPG firmar viejos commits?

93

Git ahora tiene la capacidad de firmar confirmaciones git commit -S, lo cual es genial, pero a veces olvido la marca y commit, a veces, me envío por correo los parches que solicito am, y ese comando no tiene una marca para firmar.

¿Hay alguna manera de agregar una firma a una confirmación ya registrada?

Magnus
fuente
2
Para el registro, se puede decir git para firmar siempre los envíos por configuración: git config commit.gpgsign true.
nicooga
@nicooga Ojalá tu comentario tuviera más votos a favor, así que me di cuenta de esto antes. Tuve que responder esta pregunta al menos media docena de veces, y establecer esa bandera me habría ahorrado un montón de tiempo.
Michael Ziluck

Respuestas:

78
  1. Entra en modo de rebase interactivo.
  2. Agregue la siguiente línea después de cada confirmación que desea firmar

    exec git commit --amend --no-edit -S

Esto ejecutará este comando después de elegir cada confirmación.

ACTUALIZAR:

La forma más fácil de hacer esto es:

git rebase --exec 'git commit --amend --no-edit -n -S' -i development

Esto reajusta todo hasta el desarrollo (o cualquier hash) y no tiene que copiar y pegar después de cada confirmación.

Shubham Chaudhary
fuente
Esto era justo lo que necesitaba para lo que habría sido una situación realmente tediosa, ¡gracias!
msouth
2
Oh, desearía haber encontrado esto antes. Leí muchas cosas, incluso de GitHub, diciendo que no puedes renunciar a viejos compromisos. Esto demuestra que completamente falso! Podría haber guardado cientos de confirmaciones, que ahora he aplastado. Oh bueno ... gracias por compartir! Hice un alias con esto. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"se conviertegit resign HASH
BarryMode
2
¡Esto debería ser de conocimiento común! ¡Has prestado un gran servicio a la humanidad (no sarc!)
hopeseekr
3
No hay razón para rebase en absoluto. Solo corre git commit --amend --no-edit -n -S.
Preguntas del Quolonel
9
¿No cambia esto la historia, que requiere un git push --force?
Steve
33

Firmar una confirmación cambia su contenido, por lo que las confirmaciones más recientes, dependiendo de ello, cambiarán su hash.

Si solo quieres firmar la confirmación más reciente, git commit -S --amendfuncionará.

Will Ross
fuente
13

Yo uso git rebase -i --root(ver Reescribir el historial ) y cambiar picka edit.

Luego uso git commit -S --amend --no-edit && git rebase --continue (en Windows) para cada commit.

Esto se firma manualmente para cada confirmación. Espero que encontremos una mejor solución.

Iluminador
fuente
Tengo mi directorio de inicio como un repositorio git (para dotfiles). Algunos programas captan cambios de forma interactiva como su rebase, es divertido ver la historia que se reproduce en vivo. Es lo suficientemente lento porque la firma es lenta
Avindra Goolcharan
2

También me topé con el mismo problema y aquí está mi solución:

git rebase -i --root --exec 'git commit --amend --no-edit --no-verify -S'

esto firmará todas mis confirmaciones desde la primera confirmación inicial y también omitirá el enlace de confirmación que configuré usando husky . No es necesario cambiar pickaedit .

DrSensor
fuente
1

Si desea filtrar solo confirmaciones específicas y firmar solo ellas, puede usar filter-branch:

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

Esto es útil si, por alguna razón, desea firmar solo sus propios commits.

Roberto Leinardi
fuente
0

Si necesita que GPG firme todas las confirmaciones DESDE una confirmación particular en la rama actual, puede usar lo siguiente en su lugar:

git filter-branch --commit-filter 'git commit-tree -S "$@";' <COMMIT>..HEAD

¿Dónde <COMMIT>está el id de confirmación (por ejemplo abc123e5)

Esto tiene el beneficio adicional de que no perturba los metadatos de confirmación (incluida la fecha de confirmación).

Si también desea dejar de que se le solicite su frase de contraseña GPG en cada confirmación, vea también esta respuesta: https://askubuntu.com/a/805550

NOTA: Cambiar de gpga gpg2para firmar GIT requerirá que vuelva a importar su clave privada en GPG 2.

GuyPaddock
fuente