Estoy usando git bash en Windows, y me gustaría hacer un command de git alias que es conceptualmente algo como esto:
[alias] assume_unchanged_below = "!git ls-files -z $dir | xargs -0 git update-index --assume-unchanged"
Donde $dir
expande al directory de trabajo actual en el shell bash en el que se ejecutó git assume_unchanged_below
.
Es decir, si estoy en C:\somedir\somesubdir
y ejecuto git assume_unchanged_below
me gustaría que fuera como si hubiera escrito git ls-files -z C:\somedir\somesubdir | xargs -0 git update-index --assume-unchanged
git ls-files -z C:\somedir\somesubdir | xargs -0 git update-index --assume-unchanged
Parece que es posible get el directory actual a través de git rev-parse --show-prefix
. También sé que es posible pasar arguments usando una function anónima, pero no he podido combinar estos dos conceptos para get el comportamiento que deseo.
Por ejemplo, si hago esto:
[alias] assume_unchanged_below = "!f() { \ git ls-files -z $1 | xargs -0 git update-index --assume-unchanged; \ }; f"
Entonces puedo escribir
git assume_unchanged_below `git rev-parse --show-prefix`
Y se comporta como se esperaba ( $1
se expandió correctamente al directory de trabajo actual).
Sin embargo, no quiero tener que pasar manualmente git rev-parse --show-prefix
al alias, quiero que se deduzca automáticamente para que solo tenga que escribir
git assume_unchanged_below
hacer que opere en el directory de trabajo actual.
Lo he intentado
[alias] assume_unchanged_below = "!f() { \ git ls-files -z $1 | xargs -0 git update-index --assume-unchanged; \ }; f `git rev-parse --show-prefix`"
pero esto no funciona correctamente; $1
en f()
está vacío. Presumiblemente, esto se debe a que el nuevo process de shell que está ejecutando f()
tiene el directory raíz del repository como su directory actual.
¿Es posible hacer lo que estoy tratando de hacer en un git alias, o necesito crear un alias en mi .bashrc para lograrlo?
——————– Actualización con respuesta ——————–
La sugerencia de @ vampire de usar $ GIT_PREFIX funcionó, porque $ GIT_PREFIX henetworkinga su valor del shell git desde el cual se activó el alias original.
Aquí está el ejemplo de trabajo, con adornos para la usabilidad:
[alias] assumeallbelow = "!f() { \ if [ x"$1" != x ]; then \ echo "You cannot specify the directory because this command operates on all files in the current directory and below"; \ return; \ fi; \ echo "Marking all files under $GIT_PREFIX as assume-unchanged"; \ git ls-files -z $GIT_PREFIX | xargs -0 git update-index --assume-unchanged; \ }; f"
git config alias.test '!git ls-files $GIT_PREFIX'