Internet está repleto de respuestas incorrectas y no ideales a esta pregunta. Esto es desafortunado porque pensarías que esto sería algo común que querrías hacer.Prueba de lo que está a punto de cometerse en un enganche previo a la confirmación
El problema: cuando se ejecuta un gancho pre-commit
, es posible que el repositorio no esté limpio. Así que si ingenuamente ejecutas tus pruebas, no estarán en contra de lo que estás cometiendo, pero cualquier suciedad que se encuentre en tu árbol de trabajo.
Lo más obvio es hacer git stash --keep-index --include-untracked
al comienzo de pre-commit
y git pop
en la salida. De esta manera, estás probando contra el índice (puro), que es lo que queremos.
Desafortunadamente, esto genera marcadores de conflictos de combinación si usa git add --patch
, (especialmente si edita hunks), ya que el contenido de [email protected]{0}
podría no coincidir con el árbol de trabajo después de la confirmación.
Otra solución común es clonar el repositorio y ejecutar las pruebas en uno nuevo temporal. Hay dos problemas con eso: uno es que aún no nos hemos comprometido, por lo que no podemos obtener fácilmente una copia del repositorio en el estado que estamos a punto de comprometer (estoy seguro de que hay una forma de hacerlo) , pero no estoy interesado porque :). En segundo lugar, mis pruebas pueden ser sensibles a la ubicación del directorio de trabajo actual. Por ejemplo, debido a la configuración del entorno local.
Entonces, ¿cómo puedo restaurar mi árbol de trabajo al estado en el que estaba antes del git stash --keep-index --include-untracked
, sin introducir los marcadores de conflicto de fusión y sin modificar el HEAD
post-commit?
El guión pre-commit recibe los datos que se cometen como entrada. ¿Por qué necesitas mirar algo más? Tal vez lo que estás tratando de hacer se haga mejor en algo que no sea un gancho precompromiso. ¿Qué tipo de pruebas quieres hacer que requieren acceso al repositorio completo? –
@WilliamPursell: ¿Qué quiere decir con "los datos se están comprometiendo?". El script precomprometido se ejecuta en mi árbol de trabajo (es decir, la base del repositorio de origen). El problema es que si realiza algunos cambios en el repositorio y solo monta algunos de ellos (por ejemplo, agrega algunos archivos pero no otros), entonces no estará probando el compromiso antes de que ocurra (lo que quiero hacer), estarías probando lo que tengas en tu directorio de trabajo. – pwaller
El parche que está confirmando está disponible en stdin para el gancho precompromiso. ¿Qué estás probando si no es el parche que se está comprometiendo? El propósito del gancho precompromiso es verificar el parche. –