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


337

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?


55
Una buena pregunta Solo desearía que hubiera una mejor respuesta (sin quejas a @mipadi, solo desearía que git tuviera una manera de hacer esto de una manera más automática, incluso si solo con una opción especificada para clonar git.)
lindes

Estoy de acuerdo, @lindes! ¿Pero tal vez restringir este intercambio de ganchos en intencional? Las cosas se pondrían complicadas para los usuarios de Windows, supongo.
kristianlm

@kristianlm: Hay todo tipo de razones por las que podría ser desordenado a veces ... y también cuando es bueno tenerlo allí. Solo desearía que hubiera alguna opción o algo que copiara los ganchos. Supongo que tendré que revisar el código git-core alguna vez y hacer un parche. :) (O espero que alguien más lo haga ... o viva con la solución en la respuesta de mipadi , o lo que sea.)
lindes

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

Respuestas:


144

Teóricamente, podría crear un hooksdirectorio (o el nombre que prefiera) en el directorio de su proyecto con todos los scripts y luego vincularlos .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"

usar ln -sfsi estás listo para sobrescribir lo que hay en.git/hooks


38
esto no era trivial, así que incluyo un enlace sobre cómo vincular correctamente: stackoverflow.com/questions/4592838/…
David T.

17
git versión 2.9 ahora tiene una opción de configuración para core.hooksPathconfigurar un archivo fuera de .git para vincular a la carpeta de ganchos.
Aaron Rabinowitz

216

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

Mueva sus ganchos a un hooksdirectorio rastreado en su repositorio. Luego, configure cada instancia del repositorio para usar el seguimiento en hookslugar de $GIT_DIR/hooks:

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 man githooks).


15
... y el directorio de ganchos para apuntar puede ser un repositorio de ganchos separado;)
René Link

10
Bueno, ¿este parámetro de configuración se configura automáticamente cuando haces un clon de git?
Anillo

44
Como regla, las variables de configuración de git no pueden ser establecidas por el repositorio que está clonando. Creo que esto es para evitar la ejecución de código arbitrario. git config controla la ejecución de código a través de enlaces, el nombre de usuario en los mensajes de confirmación y otras funciones importantes.
Max Shenfield

1
¿Qué pasa si alguien en el equipo realiza un pago git a otra sucursal? Tienen que incluirlo en cada rama ..
jokerster

1
Es verdad. Por otro lado, si actualiza los ganchos en los commits más nuevos, los repositorios clonados los obtendrán automáticamente cuando trabajen en ramas creadas sobre ese commit. Ambas formas tienen sus ventajas y desventajas.
fabb

15

Si su proyecto es un proyecto de JavaScript y lo usa npmcomo administrador de paquetes, puede usar shared-git-hooks para aplicar githooks npm install.


55
Ahora sé a quién se agregan intrusivamente esas porquerías .git/hooks.
gavenkoa

Advertencia: no es compatible con Windows (a menos que se ejecute como administrador en git bash). La solución simple es agregar "preinstalar": "git config core.hooksPath hooks" como un script en package.json. es decir, Where Hooks es una carpeta que contiene sus scripts git.
Shane Gannon

8

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

npm install

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 la estructura.

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

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/


5

¿Qué hay de git-hooks , enruta .git/hooksinvocar al script en el directorio del proyecto?githooks .

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


5

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/rudikershaw/git-build-hook

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

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


Traté de lograrlo de manera genérica, para usarlo en mis proyectos, así que escribí esta herramienta: pypi.org/project/hooks4git
Lovato

3

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 construcció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.


2

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 la fusión de secretos .
  2. Aplicar la configuración de usuario Git adecuada .
  3. Aplicar la integración de tickets de 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 computadora / repositorio de desarrolladores.

Descargo de responsabilidad: soy uno de los fundadores de Datrees


1

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


1

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) Scripts múltiples

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 empujar, por ejemplo.

¿Y entonces?

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 solo 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 un cheque para bloquear confirmaciones para desarrollar y dominar 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 muchas lecturas 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 para un solo gancho, algunos para un idioma específico, etc.

Una de esas herramientas, escrita por mí y ofrecida de forma gratuita como un 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.


Había publicado una versión más corta hace un tiempo, y según lo acordado con los moderadores, esto trae explicaciones y un breve enlace a una herramienta que escribí yo mismo que creo que puede ayudar a otros desarrolladores.
Lovato

1

Para usuarios de gradle

Encontré estos guiones muy útiles para proyectos de gradle.

build.gradle

apply from: rootProject.file('gradle/install-git-hooks.gradle')

gradle / install-git-hooks.gradle

tasks.create(name: 'gitExecutableHooks') {
    doLast {
        Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
    }
}
task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks

pre cometido

.... your pre commit scripts goes here
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.