2010-08-21 65 views
34

我的〜/的.gitconfig是:是否有可能通过git别名覆盖git命令?

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

然而,当我键入git的承诺,脚本不被调用。

是否有可能,或者我必须使用别名?

+2

mathepic的回答是完全正确的。当然,我认为这是一个有争议的问题。只要你别名,为什么不缩短命令?别名'co'到'!sh checkout.sh',所以你不必输入全部内容(甚至不用填写它)。 – Cascabel 2010-08-21 22:49:57

+0

这很不幸。我也会喜欢这个特性来覆盖“git log”的oneline格式的默认行为。我知道你可以使用其他别名,但只要默认的别名存在,习惯使你使用它,并永远不会学习你的替代命令:( – 2013-11-15 00:04:15

回答

34

这是不可能

这是从我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如果找到该命令,则调用exit)。

您可以通过更改行的顺序来修复此问题,并在发现别名时使handle_alias调用exit来解决此问题。

+12

git config应该可能发出某种警告,如果试图创建一个别名是相同的一个内部/外部的命令...讽刺的是,我找不到在哪里报告git-scm本身的问题。谷歌和堆栈溢出结果似乎都被管理Git的问题的工具蒙上了阴影。 – 2011-09-14 19:08:53

+1

@Daniel the git mailing list – alternative 2011-09-14 22:04:51

+0

这需要更改为git源代码,我可以用我的自定义版本替换'libexec/git-core/git-commit'。 – linquize 2013-05-24 07:27:23

14

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

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... 

矿是多一点可配置,但你明白了。

+2

这应该是可以接受的答案。用黑客版本替换'git'不是对于许多用户来说可行的解决方案 – tripleee 2017-03-29 04:37:11

+0

作为别名的替代方案,您可以在'PATH'的早期目录中将'git'符号链接到包装器脚本。显然,不是执行自己而不是真正的'git'。 – tripleee 2017-03-29 04:43:35

11

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

Hamano replies

目前的git不允许别名覆盖建宏。我明白了这个背后的推理,但不知道是不是太过保守的 。

不是。

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

因为在脚本中使用时神志清醒弹不扩大别名和 给出了一个方便的办法,甚至在命令行中击败别名。

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

和比较:

$ ./script 
$ ls 
$ /bin/ls 
9

我选择了用一个bash函数来解决这个问题。如果我拨打git clone,它会将呼叫重定向到git cl,这是我的一些添加交换机的别名。

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

编辑:我更新了代码command为阿隆建议。

+2

您可以使用'command git'来避免函数查找,而不是明确的'/ usr/local/bin/git'。请参阅'help git' – 2016-10-15 21:55:59