2010-11-13 27 views
6

Estoy planeando escribir algunos ganchos de git como un proyecto que registra las acciones del usuario en una base de datos. Esta base de datos se puede usar para consultar todas sus actividades. Las acciones que estoy tratando de iniciar la sesión sonGit personalización de gancho global

  • cometer
  • tirón
  • empuje
  • fusión
  • rama

quiero conseguir esto empaquetado en distribuciones que se pueden instalar a través gerente de empaquetación. Git permite enlaces globales mediante la colocación de cualquier tipo en $PREFIX/share/templates/hooks

la actualidad cuenta con unos ganchos que son discapacitados (.sample se adjunta a su nombre). Cuando se crea un nuevo repositorio, estos ganchos se copian en la carpeta del repositorio .git

Ahora bien, si un usuario instala el paquete de estos ganchos y ganchos como post-commit y post-update ya están habilitados. ¡En este caso, se sobrescribirá el archivo de script! Esto suena mal

Esto significa que git solo tiene un archivo hook por acción. Si necesito mantener tres ganchos para una acción, significa que no es posible. Esto significa que la instalación automatizada desde el administrador de paquetes puede generar conflictos.

Ahora piense que empaquetamos los ganchos para sobreescribir el archivo habilitado predeterminado. Si un usuario desea agregar algunas acciones más a esos archivos y luego decidió desinstalar mi paquete, ¿entonces su comando personalizado también desaparecería?

pensé que git fue muy inteligente en este sentido y que estaba mal :(

Es necesario que una carpeta se llamará post-commit y post-update acciones o lo que sea y git debe ejecutar todos los scripts dentro de esa carpeta. Soy sigue buscando una forma de lidiar con la situación actual.

+1

Puede echar un vistazo a esta [pregunta sobre el seguimiento de los ganchos de git] (http://stackoverflow.com/questions/3462955/putting-git-hooks-into-repository) - Publiqué una implementación barebones de la instalación de enlaces simbólicos en el directorio hooks, que ejecuta los hooks apropiados; es fácilmente extensible a múltiples hooks para la misma tarea y también permite a los usuarios dejar atrás sus propios hooks locales. – Cascabel

+1

Nota: Un simple "ejecutar una lista de scripts" no funcionará correctamente para todos los tipos de enlace porque algunos de ellos esperan recibir datos en stdin (por ejemplo, pre-recibir, post-recibir, post-reescribir); en la mayoría de las implementaciones ingenuas, el primer script que se ejecutaba captaba todos los datos y el resto no obtenía nada (EOF). Podría funcionar para capturar los datos una vez y alimentarlos a cada script, pero eso puede no ser apropiado para todos los scripts/situaciones. –

+0

Jefromi, gracias. Parece bueno que el enlace simbólico pueda ser una solución, pero una vez más, el problema es ¿cómo parchear git en cada máquina para que las copias de git init enganchen enlaces simbólicos a una carpeta? ¿Algún buen ejemplo? –

Respuesta

3

¿Por qué no escribir un enganche post-commit (por ejemplo) que buscará un subdirectorio "post-commit-hooks" y listará y ejecutará todos los scripts encontrados en él ?
(el primero que no se ejecute correctamente fallará el enlace post-commit)

Si los usuarios inicializan su Git repo from a predefined template directory, puede asegurarse de que todos obtengan esos scripts especiales en su nuevo repositorio.

+0

Bueno, creo que si el primer script falla, el proceso no debería detenerse. ¿Alguna razón especial para detener todos los otros scripts si uno falla? –

+0

Sí, el problema surge si el usuario inicializa sus plantillas desde un directorio predefinido. En este caso, mis scripts personales o instalados desde el paquete no pueden incluirse en tales. –

Cuestiones relacionadas