Estoy tratando de crear un alias que use múltiples comandos de Git y parámetros posicionales. Hay páginas de Stackoverflow para cada una, y parecería dolorosamente obvio hacer ambas cosas, pero estoy teniendo problemas.
Como ejemplo, quiero cambiar a branch foo y realizar un estado. Entonces en mi .gitconfig
, tengo:
[alias]
chs = !sh -c 'git checkout $0 && git status'
que no funciona Mientras que algo como esto funcionará.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Cualquier idea sería apreciada.
Respuestas:
Esto funcionará (probado con zsh y bash):
fuente
git chs foo
engit checkout && git status foo
echo $1 && echo done
, cuando se invoca con el argumento 'foo', generará tanto "foo" como "done foo".git
?!
medio principal pasa todo al shell. De lo contrario, supone que está intentando ejecutar otro comando git y lo pasa como argumentos algit
binario.;:
lugar de&& :
. Y eso también funciona bien en Unix.Esto apunta a Windows batch / msysgit bash; podría no funcionar en otros entornos.
Como han dicho Olivier Verdier y Lily Ballard
[alias] chs = !git checkout $1 && git status
casi funciona, pero da una inserción extra espuria del argumento ...
git chs demo -> git checkout demo && git status demo
Pero si agrega
&& :
al final de su alias, el argumento falso se consume en una etiqueta de ubicación.Entonces
da la salida correcta ...
git chs demo -> git checkout demo && git status
fuente
&& :
es oro y hace que esta solución funcione para comandos donde el argumento adicional sería problemático.&& :
hace?a=123;$a
errores, peroa=123; : $a
no lo hace. 2.: > hello.txt
vacía hello.txt. 3.if [ "$a" = "hello" ];then : ;fi
funciona bien pero errores sin ':'. Es comopass
en python. 4.: this is a comment
, los dos puntos seguidos por el espacio funcionan como#
en una línea de comentario.co = !git checkout public/compiled && git checkout $1
y cuando lo hicieragit co master
recibiría el mensajeerror: pathspec 'master' did not match any file(s) known to git.
. No pensé que esta respuesta fuera útil para mí porque lo primero que menciona es Windows y estoy en Linux. Pero explicaste por qué.Puede definir una función de shell.
fuente
"
Pude crear alias git de varias líneas y bastante complejos. Funcionan bien en Windows, pero supongo que también funcionarían en otro lugar, por ejemplo:
Escribí una publicación y tengo algunos ejemplos más aquí .
fuente
!f() { : reset
para obtener terminaciones del comando de reinicio github.com/git/git/blob/master/contrib/completion/…fuente
!
?!
pero, por lo que puedo ver, git supondrá de forma predeterminada que el alias es un comando git, port = status
lo que funcionará. Sin embargo, si lo intentast = git status
, no funcionará (dirá el comando "git" no encontrado). Entonces, cuando!
entra, le dice que ejecute el comando como si fuera un shell, y normalmente lo necesita cuando tiene múltiples comandos git por alias, por lo que puede tener,t = !git status && git log
por ejemplo, y funcionará.Prueba este:
Llámalo así:
git chs master
fuente
Es posible tener un alias git multilínea agregando
\
al final de cada línea.fuente
"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"
para usar mi alias.El problema aquí es que los parámetros posicionales parecen estar siendo enviados al comando de shell dos veces (a partir de git 1.9.2). Para ver a qué me refiero, prueba esto:
Entonces hazlo
git test this is my testing string
. Debe observar el siguiente resultado (las dos últimas líneas editadas aquí para mayor claridad):Una forma de evitar esto sería
Esto consumirá el parámetro posicional adicional a medida que se aplique a ese último comando de eco y no tendrá ningún efecto en los resultados.
fuente