¿Qué pasa con mi alias de Git?

Quiero un alias para que git elimine una twig de repositorys locales y remotos. Entonces, he creado uno en mi ~/.gitconfig :

 [alias] erase = !"git push origin :$1 && git branch -D $1" 

Funciona como se esperaba, elimina la sucursal del origen y local, pero en la console veo una línea adicional ( error: branch 'profile_endpoints' not found. ):

 ┌[madhead@MADHEAD-LAPTOP:/c/projects/b developing] └─$ git erase profile_endpoints To git@github.com:a/b.git - [deleted] profile_endpoints Deleted branch profile_endpoints (was abcdef0). error: branch 'profile_endpoints' not found. 

Estoy usando git version 1.8.0.msysgit.0 y git bash en Windows 7.

¿Qué me estoy perdiendo?

El problema es que cuando ejecutas un git alias, git hace tachuelas sobre los arguments al final de la cadena. Pruebe, por ejemplo:

 [alias] showme = !echo git push origin :$1 && echo git branch -D $1 

Entonces corre:

 $ git showme profile_endpoints git push origin :profile_endpoints git branch -D profile_endpoints profile_endpoints 

Hay varias soluciones. Uno trivial es suponer que a esto se le dará un argumento que se adjuntará, entonces:

 [alias] showme = !echo git push origin :$1 && echo git branch -D 

Sin embargo, esta versión aumenta el peligro de uso incorrecto:

 $ git showme some oops thing git push origin :some git branch -D some oops thing 

Otro truco estándar es definir una function de shell para que se pasen todos los arguments añadidos:

 [alias] showme = !"f() { case $# in 1) echo ok, $1;; *) echo usage;; esac; }; f" $ git showme some oops thing usage $ git showme one ok, one 

Uno que es un poco dudoso es usar un command ficticio de "absorber arguments adicionales":

 [alias] showme = !"echo first arg is $1 and others are ignonetworking; :" $ git showme one two three first arg is one and others are ignonetworking 

Mi regla personal es cambiar a un script de shell "real" tan pronto como se complique el alias. 🙂