2010-01-26 14 views
23

De acuerdo con el manual, el gancho post-checkout se ejecuta después de git checkout (como se esperaba) pero también después de git clone (a menos que pase --no-checkout).gancho git-clone y post-checkout

Muy bien, ahora, con las siguientes particularidades:

  • que no tienen un repositorio local ante un git clone
  • ganchos no se sincronizan entre los mandos a distancia
  • ganchos almacenados en un directorio de plantilla personalizada utilizado con --template se copian no ejecutables y por lo tanto no ejecutado después de git clone (que en realidad no es cierto como lo dice Jefromi en su respuesta, pero el gancho sigue siendo no ejecutado)

Parece imposible que un gancho post-checkout se ejecute después de git clone. Aún así, la página del manual githooks en http://git-scm.com/docs/githooks explícitamente establece una manera de evitar que se ejecute, y también parámetros pasados ​​en caso de que se ejecute, lo que indicaría que es posible ejecutar un enganche personalizado después de un git-clone.

Entonces, ¿cómo es posible? Obviamente me falta algo aquí.

Resulta que

+0

¿Cuál es la salida de 'git --version'? –

+0

¡Vea mi respuesta para la dependencia de la versión! – Cascabel

Respuesta

14

supongo que se podría hacer una instalación personalizada - cambiar el nombre de los ganchos en .../share/git-core/templates/hooks para eliminar el sufijo .sample.

También podría crear un directorio de plantillas lleno de enlaces simbólicos a un directorio de ganchos dentro del repositorio, (por ejemplo, post-checkout -> ../../hooks/post-checkout). Entonces, si el repositorio clonado contenía ese gancho en particular, se ejecutaría.

Tiene razón, sin embargo, en la mayoría de los casos no sucederá.

Editar: Acabo de probarlo, y la opción --template parece conservar los permisos, por lo que es una forma mucho más directa de hacerlo realidad. ¿Qué vio para indicar que despojó ese pedazo?

La última palabra en las versiones: Está buscando en la documentación en línea una versión más nueva de git que la que está utilizando. Esta característica se agregó en dfa7a6c (clonar: ejecutar el enlace posterior a la salida al momento de pagar); git describe dice que esto no fue incluido hasta v1.6.2-rc2.

+0

Bien, acabo de probar, y resulta que en realidad están copiados con el bit ejecutable (no estoy seguro de por qué creí que se lo habían quitado, debe haberlo leído en algún lugar de Internet). El gancho aún no se ejecuta, es extraño porque si hago un 'git checkout' justo después del' git clone', se ejecuta correctamente. ¿Qué versión de git tienes? Yo uso 1.6.0.4 aquí. He publicado el procedimiento exacto utilizado en una esencia: http://gist.github.com/287084 –

+0

Además, acabo de probar poner el gancho en '/ usr/share/git-core/template' y produce exactamente el mismo resultado –

+1

Hice una prueba rápida con 'clone --template' - definitivamente se ejecutó un gancho ejecutable post-checkout para mí. Uso la versión actual de git.git (en este momento, git 1.7.0.rc0.8.ge3f67d). No soy el único en mi sistema actual, por lo que probarlo con versiones anteriores tendría que esperar hasta más tarde. – Cascabel

8

Desde el githooks documentation:

Cuando se ejecuta git-init, un puñado de ejemplos de ganchos se copian en el directorio hooks del nuevo repositorio, pero por defecto, todos ellos son discapacitados. Para habilitar un gancho, renómbrelo eliminando su sufijo .sample.

Esta inicialización se lleva a cabo como parte de la creación de un clon de cuenta de la llamada a init_db en builtin-clone.c.

Por ejemplo:

$ cat /tmp/my-git-template/hooks/post-checkout 
#! /bin/bash 
echo "Hello from $0" 

$ git clone --template=/tmp/my-git-template file:///tmp/repo.git my-clone 
Initialized empty Git repository in /tmp/my-clone/.git/ 
remote: Counting objects: 3, done. 
remote: Total 3 (delta 0), reused 0 (delta 0) 
Receiving objects: 100% (3/3), done. 
Hello from .git/hooks/post-checkout
+1

La documentación aquí es más acerca de habilitarlo dentro de su propio repositorio, y el OP es obviamente consciente de esto. Por supuesto, puede eliminar el sufijo de las plantillas en el directorio de instalación (que es exactamente lo que ya he publicado). – Cascabel

+0

Por lo tanto, funciona correctamente con el tuyo, ya sea que el OP haya cometido un error en las pruebas o que se haya solucionado un error desde la versión 1.6.0, ya que lo vinculas a la fuente, ¿sospecho que estás usando una versión bastante nueva también? – Cascabel

+0

Estoy ejecutando 1.6.5.5. Tengo acceso a otra caja con 1.5.5.6 que copia el gancho y retiene los bits de ejecución, pero parece que no lo ejecuta. –