Alias de Git con parámetros posicionales
Básicamente estoy intentando poner un alias:
git files 9fa3
...para ejecutar el comando:
git diff --name-status 9fa3^ 9fa3
pero git no parece pasar parámetros posicionales al comando alias. Yo he tratado:
[alias]
files = "!git diff --name-status $1^ $1"
files = "!git diff --name-status {1}^ {1}"
...y algunos más, pero no funcionaron.
El caso degenerado sería:
$ git echo_reverse_these_params a b c d e
e d c b a
...¿cómo puedo hacer que esto funcione?
Una función de shell podría ayudar en esto:
[alias]
files = "!f() { git diff --name-status \"$1^\" \"$1\"; }; f"
Un alias sin !
se trata como un comando de Git; p.ej commit-all = commit -a
.
Con !
, se ejecuta como su propio comando en el shell, permitiéndote usar magia más fuerte como esta.
UPD
Debido a que los comandos se ejecutan en la raíz del repositorio, puede usar ${GIT_PREFIX}
variables cuando haga referencia a los nombres de archivos en los comandos.
El alias que buscas es:
files = "!git diff --name-status \"$1\"^ \"$1\" #"
Con validación de argumentos:
files = "!cd -- \"${GIT_PREFIX:-.}\" && [ x$# != x1 ] && echo commit-ish required >&2 || git diff --name-status \"$1\"^ \"$1\" #"
El final#
es importante: evita que el shell procese todos los argumentos proporcionados por el usuario (los comenta).
Nota: git
coloca todos los argumentos proporcionados por el usuario al final de la línea de comando. Para ver esto en acción, intente:GIT_TRACE=2 git files a b c d
Las comillas escapadas (debido al anidamiento) son importantes para los nombres de archivos que contienen espacios o "; rm -rf --no-preserve-root /;
)
También puedes hacer referencia sh
directamente (en lugar de crear una función):
[alias]
files = !sh -c 'git diff --name-status $1^ $1' -
(Tenga en cuenta el guión al final de la línea; lo necesitará).
Utilice GIT_TRACE=1 descrito en la página de manual de git para hacer transparente el procesamiento del alias:
$ git config alias.files
!git diff --name-status $1^ $1
$ GIT_TRACE=1 git files 1d49ec0
trace: exec: 'git-files' '1d49ec0'
trace: run_command: 'git-files' '1d49ec0'
trace: run_command: 'git diff --name-status $1^ $1' '1d49ec0'
trace: exec: '/bin/sh' '-c' 'git diff --name-status $1^ $1 "$@"' 'git diff --name-status $1^ $1' '1d49ec0'
trace: built-in: git 'diff' '--name-status' '1d49ec0^' '1d49ec0' '1d49ec0'
trace: run_command: 'less -R'
trace: exec: '/bin/sh' '-c' 'less -R' 'less -R'
MM TODO
Sus comandos originales funcionan con la versión 1.8.3.4 de git (Eimantas notó que esto cambió en 1.8.2.1).
Las opciones sh -c '..' --
y f() {..}; f
manejan limpiamente los parámetros "$@" de diferentes maneras (ver con GIT_TRACE). Agregar "#" a un alias también permitiría parámetros posicionales sin dejar los finales.