usuario - permisos en git
¿Es posible anular el comando git por git alias? (4)
Como ya se mencionó, no es posible usar un alias git para anular un comando git. Sin embargo, es posible anular un comando 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 comprueba si el primer argumento (es decir, el comando 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.
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?
Opté por resolver esto con una función bash. Si llamo a git clone
, redirigiré la llamada a git cl
, que es mi alias con algunos switches agregados.
function git {
if [[ "$1" == "clone" && "$@" != *"--help"* ]]; then
shift 1
command git cl "$@"
else
command git "$@"
fi
}
Editar: actualicé el código con el command
como sugirió Aron.
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 comando).
Puede corregir esto en sus fuentes cambiando el orden de las líneas y haciendo que handle_alias
llame a exit
si encuentra el alias.
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
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 comandos 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 comando.
$ alias ls=''ls -aF'' $ echo ls >script $ chmod +x script
y compara:
$ ./script $ ls $ /bin/ls