Aplicando un gancho post-commit de git a todos los repositorios actuales y futuros

275

He escrito un gancho post-commit de Git y funciona correctamente. Sin embargo, quiero agregar este enlace para aplicarlo a todos los repositorios git actuales (y futuros) en los que estoy trabajando. Intenté agregar el gancho a mi en ~/.git/hooks/lugar del directorio de ganchos en el directorio del proyecto, sin embargo, esto no pareció funcionar.

¿Hay alguna forma de crear ganchos Git globales que se apliquen a todos los repositorios en mi sistema (sin tener que copiarlos en cada directorio de proyecto)? Si no, ¿cuál sería la mejor solución en el futuro, tal vez una plantilla git-init?

Swanson
fuente
3
A partir de Git 2.9, este mejor enfoque ha cambiado: la respuesta de VonC es una mejor apuesta. stackoverflow.com/a/37293198/2741954
Simon Brahan
¿Responde esto a tu pregunta? cambiar los ganchos predeterminados de git
Oliver Sieweke

Respuestas:

192

Quiero agregar este gancho para aplicarlo a todos los repositorios git actuales (y futuros) en los que estoy trabajando

Con git 2.9+ (junio de 2016), todo lo que haría es:

git config --global core.hooksPath /path/to/my/centralized/hooks

Consulte " cambiar los ganchos de git predeterminados ": esto se ha hecho para administrar los ganchos centralizados.

VonC
fuente
si tengo un repositorio existente y quiero que todos los demás desarrolladores que realizan cambios tengan un enlace de precompromiso actualizado, por ejemplo, ¿cómo haría esto? gracias
Richlewis
@Richlewis, ¿quieres decir que stackoverflow.com/a/40550555/6309 no estaba completamente claro?
VonC
@Richlewis Debería configurar una carpeta compartida accesible para todos los desarrolladores, para que puedan hacer referencia en su propia configuración local.
VonC
desafortunadamente todavía no lo entiendo. dentro del repositorio, ¿ /.git/hooks/pre_commitpuedo señalarlo?
Richlewis
@Richlewis Te he respondido a tu pregunta original.
VonC
290

A partir de git 1.7.1, puede configurar init.templatedir en su gitconfig para decirle a git dónde buscar plantillas.

Configúrelo así:

git config --global init.templatedir '~/.git_template'

Posteriormente, los nuevos repositorios que cree o clone utilizarán este directorio para las plantillas. Coloque los ganchos que desee ~/.git_template/hooks. Los repositorios existentes se pueden reinicializar con las plantillas adecuadas ejecutándose git initen el mismo directorio .giten el que se encuentra.

Para las versiones de git anteriores a 1.7.1, la ejecución git init --template ~/.git_templatefuncionará si es como yo y aún desea administrar su .git_templatedirectorio junto con el resto de sus archivos de puntos. También puede usar el $GIT_TEMPLATE_DIRentorno para saber git initdónde está su directorio de plantillas.

Sklnd
fuente
51
Gran respuesta. Si alguien más se pregunta si volver a ejecutarlo git initen un repositorio existente lo borra, no lo hace , consulte: stackoverflow.com/questions/5149694/…
kontur
Para mí, no funcionó con la ruta relativa a la carpeta de plantillas git para copiar archivos usando git init en repositorios existentes. Tuve que usar la ruta completa en su lugar.
user847988
1
En ventanas sin cita: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac
1
Consejo: los ganchos de la plantilla se copian. Si desea poder actualizar los enlaces globales, coloque el enlace en otro lugar y agregue un enlace simbólico en el directorio de la plantilla (en Linux). Asegúrese de que la ruta del enlace sea absoluta.
Tim Allclair
1
Correr en git initrealidad no actualizó los ganchos para mí. Parece que no sobrescribirá los archivos que ya están allí. stackoverflow.com/questions/10791486/ . En su lugar, primero debe eliminar los archivos de enlace antiguos.
Phil R
69

Si los quiere en todas partes de su sistema (incluidos los usuarios además de usted), puede modificar el contenido del directorio de plantilla instalado: esos están en $PREFIX/share/git-core/templates/hooks, dónde $PREFIXestá probablemente /usr/localo /usr.

Si desea que esto sea solo para usted, entonces sí, lo más simple sería la --templateopción de git-init. Puede mantener fácilmente un directorio de plantillas personales que tenga enlaces simbólicos a la versión instalada de los valores predeterminados que desea mantener (enlaces individuales, el directorio de información ...) y luego su propio contenido hooks/post-commity cualquier otra cosa que desee personalizar.

Cascabel
fuente
11
Gracias, esto funcionó bien. Y para aplicarlo retroactivamente a mis proyectos existentes, simplemente corrí git initnuevamente y agregó mi nuevo gancho.
swanson
Esta es una solución clara, pero requeriría que cambie todos sus repositorios. Esto es factible, pero ¿no hay alguna posibilidad con un complemento o algo así (así es como se hace en Bazaar)?
Martin Ueding
2
Para git incrustado de SourceTree en OS X, están en/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae
1
Para Windows, esto se encuentra en el directorio de instalación de git en mingw64\share\templates\hooks(o mingw32 para 32 bits)
nerdherd
1
@nerdherd ahora está en mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer
7

Un enfoque minimalista es crear un git_hooks/directorio en su repositorio para rastrear los ganchos que escribe para ese proyecto, llamarlo la atención de los futuros usuarios al mencionarlo en un READMEarchivo y confiar en ellos para que hagan lo correcto después de que hayan clonado. He reflexionado sobre esto por un tiempo y elegí un enfoque incremental. En el futuro, podría considerar usar una herramienta como git-hooks .

Neil Best
fuente
1
Esto está muy, muy lejos de ser una solución real que tuve que rechazar, lo siento.
Victor Schröder