Cómo volver a cargar ganchos git en ganchos de plantilla

He editado algunos enlaces preexistentes y me gustaría configurarlos como pnetworkingeterminados para cuando se clona un repository. Cuando clono un nuevo proyecto puedo ver que mis ganchos están disponibles. Como no quiero volver a clonar todos mis proyectos, quiero poder volver a cargar la plantilla de git en el proyecto existente. Ejecuté git init en el mismo directory donde está ubicado .git pero los enlaces nunca sobrescriben los enlaces existentes en el proyecto en el que estaba. ¿Alguien sabe cómo volver a cargar los ganchos de templates en proyectos clonados existentes?

Dado que los files dentro de .git no están versionados, y Git no sabe que, por ejemplo, algún file existente .git/hooks/pre-commit realmente se instaló desde alguna plantilla anterior, Git no sobrescribirá el file existente con uno nuevo. de una plantilla actualizada.

Hay una manera de evitar esto, pero es un poco doloroso al less una vez. Esto es: en lugar de tener el gancho "real" en .git/hooks/ name para algún name , instalas, como .git/hooks/ name , algo que indirecta al gancho real.

En sistemas Unix-ish, eso es tan simple como hacer .git/hooks/ name un enlace simbólico al anzuelo deseado, que luego puede vivir en cualquier parte del sistema de files. En otros sistemas, donde debe haber un file ejecutable en .git/hooks/ name , puede hacer .git/hooks/ name un script de shell ejecutable de una sola línea (que generalmente tiene dos líneas de longitud) como:

 #! /bin/sh exec /path/to/real/hook 

y luego, una vez más, el gancho "real" puede vivir en cualquier lugar.

Nota al margen sobre paths relativos

Este ejemplo particular usa una ruta absoluta. Las routes relativas son posibles, pero debe tener cuidado con respecto a qué.

Si puede usar un enlace simbólico, sabrá que está vinculando en relación con el directory .git/hooks sí, de modo que un enlace simbólico de .git/hooks/pre-commit a ../../bin/pre-commit " significa " some/path/to/.git/hooks/../../bin/pre-commit , que, por el álgebra del nombre de ruta y suponiendo que .git y / o .git/hooks sí mismos no son enlaces simbólicos, se resuelve en some/path/to/bin/pre-commit , es decir, el file bin/pre-commit en el tree de trabajo. Pero si tiene un script, ../ es relativo al directory de trabajo actual del script, que no está relacionado con la location del script.

Afortunadamente, git rev-parse tiene algunas habilidades muy útiles, como:

 git rev-parse --show-toplevel 

o:

 git rev-parse --git-dir 

que producen el tree de trabajo de nivel superior y el directory .git dentro de él (como routes absolutas o relativas, pero teniendo en count el directory de trabajo actual del process que ejecuta git rev-parse ). Por lo tanto, si desea ejecutar el file bin/pre-commit en el tree de trabajo:

 exec $(git rev-parse --show-toplevel)/bin/pre-commit 

hará el truco