¿Se pueden administrar los scripts de enlace de Git junto con el repositorio?

StackOverflow https://stackoverflow.com/questions/427207

  •  06-07-2019
  •  | 
  •  

Pregunta

Nos gustaría crear algunos scripts de gancho básicos que todos podamos compartir, para cosas como formatear previamente los mensajes de confirmación. Git tiene scripts de enlace para eso que normalmente se almacenan en <project>/.git/hooks/. Sin embargo, esos scripts no se propagan cuando las personas hacen un clon y no se controlan las versiones.

¿Hay una buena manera de ayudar a todos a obtener los guiones de gancho correctos? ¿Puedo hacer que esas secuencias de comandos de enlace apunten a secuencias de comandos controladas por versión en mi repositorio?

¿Fue útil?

Solución

Teóricamente, podría crear un directorio hooks (o el nombre que prefiera) en el directorio de su proyecto con todos los scripts, y luego vincularlos en .git/hooks. Por supuesto, cada persona que clonó el repositorio tendría que configurar estos enlaces simbólicos (aunque podría ser realmente elegante y tener un script de implementación que el clonador podría ejecutar para configurarlos de forma semiautomática).

Para hacer el enlace simbólico en * nix, todo lo que necesita hacer es:

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

use ln -sf si está listo para sobrescribir lo que está en <=>

Otros consejos

En Git 2.9 , el la opción de configuración core.hooksPath especifica un directorio de ganchos personalizado.

Mueva sus ganchos a un directorio rastreado hooks en su repositorio. Luego, configure cada instancia del repositorio para utilizar el seguimiento $GIT_DIR/hooks en lugar de man githooks:

git config core.hooksPath hooks

En general, la ruta puede ser absoluta o relativa al directorio donde se ejecutan los ganchos (generalmente la raíz del árbol de trabajo; consulte la sección DESCRIPCIÓN de <=> ).

Si su proyecto es un proyecto de JavaScript y utiliza npm como administrador de paquetes, puede usar compartido -git-hooks para aplicar githooks en npm install.

¿Qué tal git-hooks , enruta .git/hooks invocar en el script bajo directorio del proyecto githooks.

También hay muchas características que le permiten minimizar el enlace de copia y enlace simbólico en todo el lugar.

La mayoría de los lenguajes de programación modernos, o más bien sus herramientas de compilación, admiten complementos para administrar git hooks. Eso significa que todo lo que necesita hacer es configurar su package.json, pom.xml, etc., y cualquier miembro de su equipo no tendrá más opción que cumplir a menos que cambien el archivo de compilación. El complemento agregará contenido al directorio .git por usted.

Ejemplos :

https://github.com/olukyrich/githook-maven-plugin

https://www.npmjs.com/package/git-hooks

Estamos utilizando soluciones de Visual Studio (y, por lo tanto, proyectos) que tienen eventos previos y posteriores a la compilación. Estoy agregando un proyecto adicional llamado 'GitHookDeployer'. El proyecto modifica un archivo en el evento posterior a la compilación. Ese archivo está configurado para copiar en el directorio de compilación. Por lo tanto, el proyecto se construye cada vez y nunca se omite. En el evento de compilación, también se asegura de que todos los ganchos git estén en su lugar.

Tenga en cuenta que esta no es una solución general, ya que algunos proyectos, por supuesto, no tienen nada que construir.

Puede hacer que su carpeta de ganchos sea otro repositorio git y vincularlo como un submódulo ... Supongo que vale la pena solo si tienes muchos miembros y ganchos que cambian regularmente.

Puede usar una solución administrada para la administración de enlace de precompromiso como precompromiso . O una solución centralizada para git-hooks del lado del servidor como Datree.io . Tiene políticas integradas como:

  1. Detecta y evita fusión de secretos .
  2. Aplicar la configuración de usuario Git adecuada.
  3. Aplicar Integración de tickets Jira - mencione el número de ticket en el nombre de solicitud de extracción / mensaje de confirmación.

No reemplazará todos sus ganchos, pero podría ayudar a sus desarrolladores con los más obvios sin la configuración infernal de instalar los ganchos en cada equipo de desarrolladores / repositorio.

Descargo de responsabilidad: soy uno de los fundadores de Datrees

pre-commit hace que esto sea fácil para ganchos de precompromiso. No responde la pregunta del OP sobre la gestión de ningún gancho git arbitrario, pero los ganchos de precompromiso son probablemente los más utilizados con fines de calidad de código.

Idealmente, los ganchos se escriben en bash, si sigue los archivos de muestra. Pero puede escribirlo en cualquier idioma disponible, y solo asegúrese de que tenga la bandera ejecutable.

Por lo tanto, puede escribir un código Python o Go para lograr sus objetivos y colocarlo debajo de la carpeta de ganchos. Funcionará, pero no se administrará junto con el repositorio.

Dos opciones

a) Multi Scripts

Puede codificar sus ganchos dentro de su ayuda y agregar un pequeño fragmento de código a los ganchos, para llamar a su script perfecto, así:

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

b) Script único

Una opción más genial es agregar solo un script para gobernarlos a todos, en lugar de varios. Entonces, creas un gancho / mysuperhook.go y apuntas cada gancho que quieras tener.

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)

El parámetro proporcionará a su script qué gancho se activó, y puede diferenciarlo dentro de su código. ¿Por qué? A veces es posible que desee ejecutar la misma verificación para confirmar y enviar, por ejemplo.

¿Y luego?

Entonces, es posible que desee tener más funcionalidades, como:

  • Active el gancho manualmente para verificar si todo está bien, incluso antes de una confirmación o inserción. Si solo llama a su secuencia de comandos (opción aob) haría el truco.
  • Active los ganchos en CI, por lo que no necesita volver a escribir las mismas comprobaciones para CI, sería simplemente llamar a los activadores de confirmación y envío, por ejemplo. Lo mismo que lo anterior debería resolverlo.
  • Llame a herramientas externas, como un validador de rebajas o un validador YAML. Puede hacer syscalls y necesita manejar STDOUT y STDERR.
  • Asegúrese de que todos los desarrolladores tengan una forma sencilla de instalar los ganchos, por lo que se debe agregar un buen script al repositorio para reemplazar los ganchos predeterminados por los correctos
  • Tenga algunos ayudantes globales, como una marca para bloquear las confirmaciones para desarrollar y dominar las ramas, sin tener que agregarlo a cada repositorio. Puede resolverlo teniendo otro repositorio con scripts globales.

¿Puede ser esto más simple?

Sí, hay varias herramientas para ayudarlo a administrar git-hooks. Cada uno de ellos está diseñado para abordar el problema desde una perspectiva diferente, y es posible que deba comprenderlos todos para obtener el que sea mejor para usted o su equipo. GitHooks.com ofrece mucha lectura sobre el enganche y varias herramientas disponibles en la actualidad.

A partir de hoy, hay 21 proyectos enumerados allí con diferentes estrategias para administrar git hooks. Algunos solo lo hacen por un solo gancho, otros por un idioma específico, etc.

Una de esas herramientas, escrita por mí y ofrecida gratuitamente como proyecto de código abierto, se llama hooks4git . Está escrito en Python (porque me gusta), pero la idea es manejar todos los elementos enumerados anteriormente en un solo archivo de configuración llamado .hooks4git.ini, que se encuentra dentro de su repositorio y puede llamar a cualquier script que desee llamar, en cualquier idioma .

Usar git hooks es absolutamente fantástico, pero la forma en que se ofrecen generalmente solo aleja a las personas de él.

Para los usuarios de Nodejs , una solución simple es actualizar package.json con

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks", 

La preinstalación se ejecutará antes

  

instalación npm

y redirige git para buscar ganchos dentro del directorio . \ hooks (o el nombre que elija). Este directorio debe imitar . \. Git \ hooks en términos de nombre de archivo (menos el .sample) y estructura.

Imagine Maven y otras herramientas de compilación tendrán un equivalente a preinstalación .

También debería funcionar en todas las plataformas.

Si necesita más información, consulte https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top