2010-09-13 20 views
58

Con un repositorio oficial como el remoto y múltiples repositorios locales clonados a partir de él, ¿puede un guión precomprometido ser escrito en ese repositorio principal y aplicarse en todos los clones del mismo?Gancho precomprometido/compartido de Git

+4

Si desea * ejecución *, use un enlace de actualización en el repositorio central. Si el gancho realiza la verificación por compromiso, aún puede proporcionar un enlace precompromiso; es probable que los desarrolladores lo adopten de forma voluntaria, para que puedan descubrir de inmediato cuando han hecho algo mal, en lugar de esperar hasta que intenten presionar. – Cascabel

+1

Posibles duplicados: (http://stackoverflow.com/questions/3462955/) y (http://stackoverflow.com/questions/427207/) – blong

Respuesta

46

No lo creo, ya que los ganchos no están clonados.
Puede ser si esa secuencia de comandos hook está versionada, y luego enlaza a (enlace simbólico) en los servidores de clonación (siempre que su sistema operativo soporte esa función de enlace).

O tal vez si los ganchos son parte de un git template directory utilizado para crear los clones (que solo garantizarían su presencia en el repositorio de clonación, eso no garantizaría que realmente se usen y ejecuten).

Pero no creo que haya ninguna forma "central" de hacer cumplir un compromiso.


Como Jefromi explica aún más claramente en los comentarios (el énfasis es mío):

Creo que realmente va en contra de la idea de un repositorio git a ganchos han distribuido forzadas con el repositorio.
Mi clon es mi repositorio. Debería poder usar git como me gusta, incluso elegir si ejecutar o no anzuelos.
(Y desde un punto de vista de la seguridad, eso sería realmente un poco de miedo -. Nadie debe tener la capacidad para obligarme a ejecutar ciertas secuencias de comandos cada vez que ejecutar ciertos comandos git)

estoy de acuerdo con ese comentario , y solo hemos visto formas de aplicar las reglas aplicadas localmente, en un repositorio especializado determinado.
Por ejemplo, no presionaría para el repositorio central directamente, sino que primero presionaría para un repositorio de QA que aceptaría su confirmación solo si sigue ciertas reglas. Si lo hace, entonces el repo de QA impulsará su compromiso al repositorio central.

Otra ilustración derivada directamente de lo que acabo de mencionar sería "Serverless Continuous Integration with Git", una forma de aplicar local compilación privada que funciona antes de empujarlos a cualquier parte.

+6

Creo que realmente va en contra de la idea de que un repositorio git tenga ganchos forzados distribuidos con el repositorio. Mi clon es * mi * repositorio. Debería poder usar git como me gusta, incluso elegir si ejecutar o no anzuelos. (Y desde el punto de vista de la seguridad, eso sería realmente aterrador: nadie debería tener la capacidad de obligarme a ejecutar ciertos guiones cada vez que ejecute ciertos comandos de git). – Cascabel

+1

@Jefromi: ¿sabes qué es lo que te asusta? Cuando escribí el comentario, antes de enviar mi respuesta editada, comencé a escribir 'agregar ...', y Firefox en mi computadora me propuso: "agregar el comentario de Jefromi". No es la primera vez que he estado allí, obviamente;) – VonC

+0

Nota para mí: vea también http://stackoverflow.com/questions/3209208/what-is-the-cleverest-use-of-source-repository-that-you -have-ever-seen/3209767 # 3209767 – VonC

5

¿Puede un enganche de precompilación se puede generar mediante scripts en ese repositorio principal y se aplica en todos los clones del mismo?

De githooks(5):

 
    pre-commit 
     This hook is invoked by git commit, and can be bypassed with 
     --no-verify option. 

Desde el gancho fácilmente se puede omitir, parece que la respuesta a su pregunta es "no".

Además, como el directorio .git/hooks no está clonado, no parece haber un mecanismo para enviarlo al cliente.

8

No puede haber forzado el gancho de precompilación en los repositorios locales de personas, pero en su repo central aún puede ejecutar un gancho de pre-recepción.

F. ex Tenía que estar seguro de que los mensajes de confirmación obedecían ciertas reglas (para integración de trac, etc.) así que utilicé el siguiente enlace de pre recepción, que comprueba cada mensaje de confirmación enviado al repositorio central y denegará empuje si no está bien formado.

 
#!/bin/sh 
while read rev_old rev_new ref 
do 
    MALFORMED="$(git rev-list --oneline $rev_old..$rev_new | egrep -v '#[0-9]+' | awk '{print $1}')" 
    if [ x"$MALFORMED" != x ] 
    then 
     echo Invallid commit message on $MALFORMED 
     exit 1 
    fi 
done 

para más información ver f.ex https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

2

Asumiendo que tiene el código fuente en su repositorio git que tiene un sistema de construcción asociada a ella, se puede configurar el sistema de construcción para establecer el pre-commit gancho, es decir, moviendo o enlazando un gancho precompromiso que ~ está versionado.

No he intentado esto todavía. Vine aquí mientras busqué en Google una solución mejor.

Cuestiones relacionadas