¿Cómo puedo encontrar adiciones sin firmar a un git repo?

Quiero que todos los usuarios firmen criptográficamente sus contribuciones a un repository de git. Cometa, tags, fusiones, todo.

Suponiendo que este process es defectuoso y alguien accidentalmente o a propósito se las arregla para introducir un cambio en el repository que no ha sido firmado. ¿Cómo puedo detectar esta situación?

(Además, ¿cómo especifico correctamente que "todo debe estar firmado"? Me sorprendió saber que las fusiones se pueden firmar por separado de las confirmaciones. ¿Qué más hay?)

Este tipo escribió un script que encontrará commits sin firmar en un repository.

#!/bin/sh # # Validate signatures on each and every commit within the given range ## # if a ref is provided, append range spec to include all children chkafter="${1+$1..}" # note: bash users may instead use $'\t'; the echo statement below is a more # portable option t=$( echo '\t' ) # Check every commit after chkafter (or all commits if chkafter was not # provided) for a trusted signature, listing invalid commits. %G? will output # "G" if the signature is trusted. git log --pretty="format:%H$t%aN$t%s$t%G?" "${chkafter:-HEAD}" \ | grep -v "${t}G$" # grep will exit with a non-zero status if no matches are found, which we # consider a success, so invert it [ $? -gt 0 ] 

Basado en la respuesta de spraff y basado en cierta experimentación en las opciones de formatting de git log , he encontrado la siguiente secuencia de commands para encontrar commits sin firmar. Instala esto en tu PATH como un file llamado git-unsigned y puedes invocarlo como git unsigned o git-unsigned :

 #!/bin/bash set -e function main() { if [ "$1" == "-h" -o "$1" == "--help" ]; then echo "usage: git-unsigned [-h|--help] [options]" >&2 echo "Show long refs for all unsigned/unverified git commits in the current tree." >&2 echo " -h, --help Display this usage guide." >&2 echo " options Options to be passed to the invocation of git log." >&2 return 1 fi git log --pretty='format:%H|%aN|%s|%G?' $@ | awk -F '|' '{ if($4 != "G"){print $1;} }' } if [[ ${BASH_SOURCE[0]} == $0 ]]; then main $@ fi 

En mi caso, encontré uno que no era prudente y no firmó mi compromiso:

 575274a81b63d231f20e524b65030d96682fc646 

Desafortunadamente, la solución a esto es básicamente corregir el compromiso y firmarlo, lo que reescribirá el historial de Git y esto es malo ™.

Lo mejor que se puede hacer es usar esta herramienta como una herramienta de auditoría para ver estos commits, y al examinar el commit, nada sospechoso se encuentra en git show 575274a81b63d231f20e524b65030d96682fc646 .

Creo , aunque no estoy seguro, que si uno fuera a reescribir este compromiso y forzarlo a empujar, las firmas de otros commits serían desmanteladas o invalidadas, así que creo que todavía estamos en verde con esto, pero me gustaría encontrar el time y probarlo.