是否有可能通过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议更新了代码。