Necesito orientación con mi gancho Git para precomprometirme usando Bash

De acuerdo, lo que estoy intentando hacer para nuestro proyecto es hacer que el desarrollador elija si quiere comprometer o comstackr y luego confirmar su código. Esto se debe a que tenemos un formateador de código que lo limpia todo y, actualmente, en las implementaciones, muchas no se están comstackndo antes de su request de fusión. Entonces, al tener este file en todos los proyectos, se les recordará y tendrán que elegir uno.

Actualmente, el problema es tratar de llamar a la construcción maven en este momento. No puedo hacer un cd ../../ hasta la carpeta raíz del proyecto. ¿Sugerencias sobre cómo hacer que esto funcione? Por favor, no quiero tener un debate o discusión sobre por qué se decidió esto. Solo necesito apuntar en la dirección de cómo hacer que esto funcione. Gracias.

echo "CC to Compile and Commit" "C to just compile" while true; do read choice echo "Your choice was " $choice if ( "$choice" == CC" ) ; then cd ../../ if [ mvn compile ] ; then echo "Compile was okay." echo "Continue with git commit." fi fi break done 

Por favor use:

 if ( mvn compile ) ; then 

[ es para ejecutar el command de testing en realidad

Una buena forma de crear menus en bash es con el command de select , aquí hay un ejemplo (se supone que se ejecuta en algún lugar del directory del proyecto):

 #! /bin/bash cmds=("Commit" "Compile and commit") select cmd in "${cmds[@]}"; do pushd "$(git rev-parse --show-toplevel)" echo "You picked $cmd, working dir changed to $(pwd)" if [[ $cmd == "Compile and commit" ]]; then mvn compile if [[ $? != "0" ]]; then echo "Something went wrong" else echo "Comstacktion ok!" fi fi #git commit popd echo "Done, working dir now $(pwd)" break done 

Sin dirigirse a ninguno de los expertos, o si esto es algo razonable de hacer en un enlace precompromiso, hay varios puntos a considerar aquí:

  • Los ganchos Git se ejecutan en algún directory.

    El directory de trabajo de stream preciso para el gancho varía. Si git commit se ejecuta en cualquier lugar dentro del tree del repository, el gancho de precompilation se ejecuta en el nivel superior del repository de Git. Esto es cierto independientemente del subdirectory en el que se encuentre:

     $ cat .git/hooks/pre-commit #! /bin/sh echo precommit: pwd = $(pwd) exit 1 $ git commit precommit: pwd = [snip]/git $ cd Documentation $ git commit precommit: pwd = [snip]/git 

    Tenga en count que esto no fue .../git/Documentation pesar del hecho de que estaba en el subdirectory de documentation.

    Si git commit se ejecuta en otro lugar, el directory de trabajo actual puede no ser el nivel superior del repository y, de hecho, puede no estar relacionado con el repository en sí o con el tree de trabajo:

     $ cd /tmp $ git --git-dir=$HOME/src/kernel.org/git/.git commit precommit: pwd = /tmp 

    Por lo tanto, es vital: (1) restringir la location donde se ejecuta la ejecución de git commit , o (2) evitar en absoluto el uso del directory de trabajo actual. Puse esto en negrita debido al tercer punto a continuación. Sin embargo, si lo desea, puede tratar el directory de trabajo actual como el tree de trabajo: no hay necesidad de intentar cd ../.. fuera del directory .git/hooks .

  • La input estándar de un gancho Git a menudo no está conectada al terminal del usuario, suponiendo que haya un usuario y un terminal en primer lugar. Por ejemplo:

     $ cat .git/hooks/pre-commit #! /bin/sh if [ -t 0 ]; then echo precommit: stdin is a tty else echo precommit: stdin is NOT a tty fi exit 1 $ git commit precommit: stdin is NOT a tty 

    Si bien puede intentar abrir /dev/tty , esto solo funcionará si hay un /dev/tty abierto, por lo que existe un riesgo aquí.

  • Durante una git commit , los contenidos del tree de trabajo no son los contenidos que se comprometerán. Lo que se comprometerá será lo que esté en el índice . El examen del tree de trabajo solo es correcto si el índice coincide con el tree de trabajo. Puede probar esto usando la function de shell require_clean_work_tree en git-sh-setup , que está en git --exec-path , y git --exec-path se ha agregado al git --exec-path de $PATH , por lo que puede simplemente ejecutar :

     . git-sh-setup require-clean-work-tree "commit" "message to emit if work tree is not clean" 

    por ejemplo (los dos arguments son la acción y el post para producir en caso de falla ).

Dicho eso, el otro problema que encontraste es que:

 [ expression ] 

es la syntax para ejecutar el [ command, pasando su expression ] como sus parameters. (El [ command también se conoce como el command de test ; cuando se invoca como test <expression> no exige un argumento final ] , y de lo contrario funciona igual que cuando se ejecuta como [ .) Usted quería ejecutar el command mvn , no el [ o command de test .