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 fooengit checkout && git status fooecho $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 algitbinario.;: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 statuscasi funciona, pero da una inserción extra espuria del argumento ...
git chs demo -> git checkout demo && git status demoPero 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 statusfuente
&& :es oro y hace que esta solución funcione para comandos donde el argumento adicional sería problemático.&& :hace?a=123;$aerrores, peroa=123; : $ano lo hace. 2.: > hello.txtvacía hello.txt. 3.if [ "$a" = "hello" ];then : ;fifunciona bien pero errores sin ':'. Es comopassen 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 $1y cuando lo hicieragit co masterrecibirí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() { : resetpara 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 = statuslo 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 logpor ejemplo, y funcionará.Prueba este:
Llámalo así:
git chs masterfuente
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