Usando el gancho de actualización
Usted sabe acerca de ganchos - Por favor, lea la documentation sobre ellos! El gancho que probablemente quiera es la actualización, que se ejecuta una vez por ref. (El gancho de pre-recepción se ejecuta una vez durante todo el proceso). Hay toneladas y toneladas de preguntas y respuestas sobre estos ganchos que ya están en SO; dependiendo de lo que quieras hacer, probablemente puedas encontrar orientación sobre cómo escribir el enlace si lo necesitas.
Destacar que esto realmente es posible, una cita de la documentación:
Este gancho se puede utilizar para evitar la actualización forzada de ciertos árbitros, asegurándose de que el nombre del objeto es un objeto de comprometerse que es una descendiente del objeto commit nombrado por el antiguo nombre del objeto. Es decir, para hacer cumplir una política de "avance rápido".
También se podría utilizar para registrar el antiguo ... nuevo estado.
Y los detalles:
El gancho se ejecuta una vez para cada árbitro que actualizarse, y toma tres parámetros:
- el nombre de la ref en proceso de actualización,
- la nombre de objeto antiguo almacenado en la referencia,
- y el nuevo nombre de objeto que se almacenará en la referencia.
Así, por ejemplo, si usted quiere asegurarse de que ninguno de los sujetos cometen son más de 80 caracteres, una aplicación muy rudimentaria sería:
#!/bin/bash
long_subject=$(git log --pretty=%s $2..$3 | egrep -m 1 '.{81}')
if [ -n "$long_subject" ]; then
echo "error: commit subject over 80 characters:"
echo " $long_subject"
exit 1
fi
Por supuesto, eso es una ejemplo de juguete; en el caso general, debe usar un resultado de registro que contenga el mensaje de compromiso completo, dividirlo por compromiso y llamar a su código de verificación en cada mensaje de compromiso individual.
Por qué desea que el gancho de actualización
Esto ha sido discutido/aclarado en los comentarios; aquí hay un resumen.
El gancho de actualización se ejecuta una vez por ref. Una referencia es un puntero a un objeto; en este caso, estamos hablando de ramas y etiquetas, y generalmente solo ramas (las personas no presionan las etiquetas con frecuencia, ya que generalmente son solo para marcar versiones).
Ahora, si un usuario está empujando cambios a dos ramas, principal y experimental:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o (origin/experimental) - o - o (experimental)
Supongamos que X es el "malo" cometer, es decir, la que fallaría el gancho cometer-msg. Claramente, no queremos aceptar el empuje para dominar. Por lo tanto, el gancho de actualización rechaza eso. ¡Pero no hay nada malo con los commits en experimental! El gancho de actualización acepta ese. Por lo tanto, origin/master se mantiene sin cambios, pero el origen/experimental se actualiza:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o - o - o (origin/experimental, experimental)
El pre-recibir el gancho se ejecuta sólo una vez, justo antes de comenzar a actualizar árbitros (antes de la primera vez que el gancho de actualización se ejecuta). Si lo usaste, tendrías que hacer que falle el impulso completo, diciendo que debido a que hubo un mensaje de compromiso erróneo en el maestro, de alguna manera ya no confías en que los commits en experimental sean buenos, ¡aunque sus mensajes estén bien!
Creo que el gancho que el OP está buscando es pre-recibir, ya que él/ella quiere rechazar todo el impulso dependiendo del mensaje de confirmación. Sin embargo, AFAIK, ni pre-recibir ni actualizar recibir el mensaje de confirmación como entrada. Entonces, usar commit-msg probablemente sea la mejor solución. –
@ Can: Estoy bastante seguro de que el OP quiere actualizar, no pre-recibir. "Todo el empuje" significa el empuje para todas las ramas. Si el usuario intenta insertar actualizaciones en tres ramas, y solo una contiene mensajes de confirmación inválidos, ¡los otros dos aún deben ser aceptados! – Cascabel
@Can: Y no, el mensaje de confirmación no forma parte de la entrada, pero sí lo son los nombres de objeto (confirmación) antiguos y nuevos (SHA1). Tenga en cuenta que el enlace de actualización se ejecuta justo antes de actualizar los refs (después de que se hayan recibido los objetos de confirmación). Por lo tanto, el gancho puede usar git log para inspeccionar lo que quiera sobre las confirmaciones entre antiguas y nuevas, incluidos sus mensajes de confirmación. – Cascabel