En un gancho de git, ¿se garantiza que el directorio de trabajo actual está dentro del repositorio de git?


81

Experimentalmente, parece que los ganchos de git se ejecutan con el directorio actual configurado para ser la raíz del repositorio. Sin embargo, no puedo ver ninguna garantía al respecto en la documentación de git. ¿Debo confiar en el directorio de trabajo actual para ubicar el repositorio de git, o hay una mejor manera de resolver el repositorio de git asociado con el gancho?


4
No estoy seguro de cuánto está relacionado. En una caja estable de Gentoo con Git 2.7.3 (-r1), los ganchos de git no solo se ejecutan .gitsino que en git reset --hardrealidad crean la estructura del directorio de trabajo dentro del .gitdirectorio, lo cual, en mi opinión, ¡es algo completamente incorrecto!
Pavel Šimerda

Respuestas:


45

Se basa en el valor establecido para la variable de entorno GIT_DIR. Se establece en la raíz del repositorio cuando el gancho comienza a ejecutarse. Muchos ganchos, especialmente aquellos que realizan una extracción desde otro repositorio, desarman (y restablecen) esta variable de entorno según sea necesario.


6
¿$ GIT_DIR tiene una barra inclinada al final?
PuercoPop

8
Esta NO es una respuesta correcta. GIT_DIR NO siempre se establece en la raíz del repositorio. Vea este blog .
Ghopper21 de

2
@ Ghopper21 Ese artículo tampoco es del todo correcto. Dice que para el enlace posterior a la confirmación, el directorio actual es el nivel superior del árbol de trabajo. Sin embargo, mi muy simple script posterior a la confirmación no encontró otros scripts en el nivel superior del árbol de trabajo. por ejemplo:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found
Vince

67

Las respuestas actuales parecen estar desactualizadas. A partir de 2.9.0, los documentos establecen lo siguiente:

Antes de que Git invoca un gancho, cambia su directorio de trabajo a la raíz del árbol de trabajo en un repositorio no desnudo o al $ GIT_DIR en un repositorio simple.

https://git-scm.com/docs/githooks/2.9.0


11
Gran respuesta. Se hizo una aclaración en revisiones posteriores (2.13.0). "Una excepción son los ganchos activados durante un envío (pre-recepción, actualización, post-recepción, post-actualización, push-to-checkout) que siempre se ejecutan en $ GIT_DIR".
Novato C

2
Fuente / contexto para la cita anterior: git-scm.com/docs/githooks#_description
jmcker

En lenguaje sencillo: es el directorio de nivel superior de su repositorio. ("Bare" se refiere esencialmente a un repositorio que consta solo del .gitdirectorio y sin archivos extraídos).
Ben Mares,

4

Puede utilizar la variable de entorno $GIT_DIR. $GIT_DIRapunta al .gitdirectorio.


¿Qué tan probable es que $GIT_DIR/..apunte a la raíz del repositorio?
David Lord

No es infalible. No lo use $GIT_DIR/... Eso se romperá cuando el repositorio sea un repositorio simple. Un repositorio simple no tiene un directorio de trabajo, por lo tanto, no hay "raíz del repositorio". También se romperá cuando .git sea un enlace.
holygeek

1
Figurado. ¿Alguna forma de obtener la raíz del repositorio en condiciones de uso normal? ¿Para un gancho de confirmación previa que usa el repositorio como archivos de configuración para un programa, por ejemplo?
David Lord

3
Esto NO es correcto en todos los casos. Vea este blog .
Ghopper21
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.