¿Es posible anular el command git por git alias?

mi ~ / .gitconfig es:

[alias] commit = "!sh commit.sh" 

Sin embargo, cuando escribo git commit , el script no se llama.

¿Es posible, o tengo que usar otro nombre de alias?

No es posible

Esto es de mi clon de git.git:

 static int run_argv(int *argcp, const char ***argv) { int done_alias = 0; while (1) { /* See if it's an internal command */ handle_internal_command(*argcp, *argv); /* .. then try the external ones */ execv_dashed_external(*argv); /* It could be an alias -- this works around the insanity * of overriding "git log" with "git show" by having * alias.log = show */ if (done_alias || !handle_alias(argcp, argv)) break; done_alias = 1; } return done_alias; } 

Entonces no es posible. ( handle_internal_command llama a exit si encuentra el command).

Puede corregir esto en sus fonts cambiando el order de las líneas y haciendo que handle_alias llame a exit si encuentra el alias.

Como ya se mencionó, no es posible usar un alias git para anular un command git. Sin embargo, es posible anular un command git usando un alias de shell. Para cualquier shell POSIXy (es decir, no MS cmd ), escriba un script ejecutable simple que realice el comportamiento modificado deseado y establezca un alias de shell. En mi .bashrc (Linux) y .bash_profile (Mac) tengo

 export PATH="~/bin:$PATH" ... alias git='my-git' 

En mi carpeta ~/bin tengo un script ejecutable de Perl llamado my-git que comtesting si el primer argumento (es decir, el command git) es clone . Se ve esencialmente así:

 #!/usr/bin/env perl use strict; use warnings; my $path_to_git = '/usr/local/bin/git'; exit(system($path_to_git, @ARGV)) if @ARGV < 2 or $ARGV[0] ne 'clone'; # Override git-clone here... 

El mío es un poco más configurable, pero entiendes la idea.

No solo no es posible, sino también WONTFIX en 2009 http://git.661346.n2.nabble.com/allowing-aliases-to-override-builtins-to-support-default-options-td2438491.html

Hamano responde :

Actualmente, git no permite que los alias anulen los builtins. Entiendo el razonamiento detrás de esto, pero me pregunto si es demasiado conservador.

No lo es.

La mayoría de las shells soportan commands superiores con alias, y no estoy seguro de por qué git necesita ser más conservador que el shell.

Debido a que los shells cónicos no expanden los alias cuando se usan en un script, y brindan una forma práctica de vencer el alias incluso desde la línea de command.

 $ alias ls='ls -aF' $ echo ls >script $ chmod +x script 

y compara:

 $ ./script $ ls $ /bin/ls 

Opté por resolver esto con una function bash. Si llamo a git clone , networkingirigiré la llamada a git cl , que es mi alias con algunos switches agregados.

 function git { if [[ "$1" == "clone" && "[email protected]" != *"--help"* ]]; then shift 1 command git cl "[email protected]" else command git "[email protected]" fi } 

Editar: actualicé el código con el command como sugirió Aron.