是否有可能通过git别名覆盖git命令?

我的〜/ .gitconfig是:

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

但是,当我inputgit commit时 ,脚本不会被调用。

这是可能的,或者我必须使用另一个别名?

这不可能

这是从我的克隆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; } 

所以它不可能。 ( handle_internal_command在find命令时调用exit )。

你可以通过改变这些行的顺序来解决这个问题,并且如果find了别名, handle_alias调用exit

如前所述,使用git别名来覆盖git命令是不可能的。 但是,可以使用shell别名覆盖git命令。 对于任何POSIXy shell(即不是MS cmd ),编写一个简单的可执行脚本来执行所需的修改行为并设置shell别名。 在我的.bashrc (Linux)和.bash_profile (Mac)中有

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

在我的~/bin文件夹中,我有一个名为my-git的可执行Perl脚本,用于检查第一个参数(即git命令)是否为clone 。 它看起来像这样:

 #!/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... 

我的可configuration性更强一点,但你明白了。

不仅不可能,而且WONTFIX在2009年http://git.661346.n2.nabble.com/allowing-aliases-to-override-builtins-to-support-default-options-td2438491.html

Hamano回复 :

目前git不允许别名覆盖内build。 我理解这背后的推理,但我不知道这是否过于保守。

不是这样。

大多数shell支持用别名覆盖命令,我不知道为什么git需要比shell更保守。

因为理智的shell在脚本中使用时不会扩展别名,并且提供了一种方便的方法来打败别名,即使是在命令行中也是如此。

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

并比较:

 $ ./script $ ls $ /bin/ls 

我select用bash函数来解决这个问题。 如果我打电话给git clone ,它将redirect到git cl ,这是我的别名与一些添加的开关。

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

编辑:我用Aron的build议更新了代码。