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?

Dickon Reed
fuente
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.

manojlds
fuente
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

Ohad Schneider
fuente
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.

Holygeek
fuente
¿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