我的〜/的.gitconfig是:是否有可能通过git别名覆盖git命令?
[alias]
commit = "!sh commit.sh"
然而,当我键入git的承诺,脚本不被调用。
是否有可能,或者我必须使用别名?
我的〜/的.gitconfig是:是否有可能通过git别名覆盖git命令?
[alias]
commit = "!sh commit.sh"
然而,当我键入git的承诺,脚本不被调用。
是否有可能,或者我必须使用别名?
这是不可能
这是从我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
来解决此问题。
git config应该可能发出某种警告,如果试图创建一个别名是相同的一个内部/外部的命令...讽刺的是,我找不到在哪里报告git-scm本身的问题。谷歌和堆栈溢出结果似乎都被管理Git的问题的工具蒙上了阴影。 – 2011-09-14 19:08:53
@Daniel the git mailing list – alternative 2011-09-14 22:04:51
这需要更改为git源代码,我可以用我的自定义版本替换'libexec/git-core/git-commit'。 – linquize 2013-05-24 07:27:23
如前所述,使用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...
矿是多一点可配置,但你明白了。
不仅不可能,而且WONTFIX在2009年http://git.661346.n2.nabble.com/allowing-aliases-to-override-builtins-to-support-default-options-td2438491.html
目前的git不允许别名覆盖建宏。我明白了这个背后的推理,但不知道是不是太过保守的 。
不是。
大多数shell支持用别名覆盖命令,我不确定 为什么git需要比shell更保守。
因为在脚本中使用时神志清醒弹不扩大别名和 给出了一个方便的办法,甚至在命令行中击败别名。
$ alias ls='ls -aF' $ echo ls >script $ chmod +x script
和比较:
$ ./script $ ls $ /bin/ls
我选择了用一个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
为阿隆建议。
您可以使用'command git'来避免函数查找,而不是明确的'/ usr/local/bin/git'。请参阅'help git' – 2016-10-15 21:55:59
mathepic的回答是完全正确的。当然,我认为这是一个有争议的问题。只要你别名,为什么不缩短命令?别名'co'到'!sh checkout.sh',所以你不必输入全部内容(甚至不用填写它)。 – Cascabel 2010-08-21 22:49:57
这很不幸。我也会喜欢这个特性来覆盖“git log”的oneline格式的默认行为。我知道你可以使用其他别名,但只要默认的别名存在,习惯使你使用它,并永远不会学习你的替代命令:( – 2013-11-15 00:04:15