Alias ​​de Git con parámetros posicionales

Resuelto ramses0 asked hace 14 años • 7 respuestas

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?

ramses0 avatar Jul 24 '10 02:07 ramses0
Aceptado

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.

Cascabel avatar Jul 23 '2010 21:07 Cascabel

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: gitcoloca 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 /;)

Tom Hale avatar Sep 16 '2016 03:09 Tom Hale

También puedes hacer referencia shdirectamente (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á).

mipadi avatar Jul 24 '2010 21:07 mipadi

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() {..}; fmanejan 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.

bsb avatar Aug 26 '2013 01:08 bsb