Error de finalización de la pestaña Bash git alias

Sé que los alias de Git se pueden usar con los arguments de la sección Git Faq "Alias ​​de Git con argumento" .

Pero hoy encontré un error.

Tome un ejemplo fácil que no es adecuado para un uso real . Si hago un alias como este:

[alias] lo = "!sh -c 'git log $1' -" 

entonces puedo usar

 git lo file_a 

para ver el logging de file_a.

Pero cuando utilicé "tab" para autocomplete la ruta, se produce el siguiente error.

 git lo [tab] 

post de error:

 sh: declare: `_git_{': not a valid identifier 

Parece un error en git-completion.bash. ¡Pero no puedo encontrar dónde está `_git_ {'!

También encuentro que en el post de error, la comilla alnetworkingedor de _git_ {parece extraña.

Por cierto, mi versión msysgit es 1.7.6-preview20110708

AÑADIR:

La otra cosa extraña es que busqué todos los files bajo el directory de Git, encuentro que no hay ningún file que contenga la cadena _git_ { .

Supongo que hay una function de finalización personalizada configurada para git, y el error está en esa configuration. Intente eliminar la finalización personalizada primero y vea si el error desaparece:

 complete -r git 

Nota al margen: para commands de shell con arguments reutilizables en git alias, la expresión moderna es definir una function de shell, que le permite utilizar el procesamiento de arguments de shell estándar y tiene un nivel menor de arguments para tratar cuando se compara con 'sh -c ':

 [alias] plush = "!f() { git pull \"$@\" && git push \"$@\" }; f" 

Tuve exactamente el mismo problema. Por ejemplo, tenía un alias para eliminar una twig local y su contraparte remota de una vez:

 [alias] db = "!f() { git branch -d $1 && git push origin :$1; }; f" 

Para solucionar el problema, eliminé el alias y agregué un file llamado git-db a mi directory de scripts de Git. Puede ser cualquier directory en el PATH . Aquí está el contenido del file.

 #!/bin/sh git branch -d $1 && git push origin :$1 

Tenga en count que el file no debe tener una extensión. Se puede usar como el alias:

 git db mybranch 

Este error se debe a una falla en el script de finalización de bash que se envió con versiones anteriores de Git. No fue diseñado para manejar alias de shell, lo que causó este error. Esto se corrigió en commit 56f24e80f0 , pero este cambio no se incluyó hasta Git 2.1.0. Sin embargo, msysGit está en este momento escribiendo en Git 1.9.5 y por lo tanto no incluye la corrección.

La solución preferida es cambiar a Git para Windows , el sucesor de msysGit, que rastrea las versiones actuales de Git.

Sin embargo, si está atascado con una versión anterior de Git, puede solucionar el problema reemplazando el alias por un script personalizado, como se describe en la respuesta de @Reinhard Nägele .