1

我想要一个 git 的别名来从本地和远程存储库中删除一个分支。所以,我在我的~/.gitconfig

[alias]
    erase = !"git push origin :$1 && git branch -D $1"

它按预期工作,从原点和本地删除分支,但在控制台中我看到额外的行(error: branch 'profile_endpoints' not found.):

┌[madhead@MADHEAD-LAPTOP:/c/projects/b developing]
└─$ git erase profile_endpoints
To git@github.com:a/b.git
 - [deleted]         profile_endpoints
Deleted branch profile_endpoints (was abcdef0).
error: branch 'profile_endpoints' not found.

我在 Windows 7 上使用git version 1.8.0.msysgit.0和。git bash

我错过了什么?

4

1 回答 1

2

问题是,当您运行 git 别名时,git 会在字符串末尾添加参数。试试,例如:

[alias]
    showme = !echo git push origin :$1 && echo git branch -D $1

然后运行:

$ git showme profile_endpoints
git push origin :profile_endpoints
git branch -D profile_endpoints profile_endpoints

有各种解决方法。一个简单的方法是假设这将被赋予一个将被附加的参数,因此:

[alias]
    showme = !echo git push origin :$1 && echo git branch -D

但是,此版本增加了误用的危险:

$ git showme some oops thing
git push origin :some
git branch -D some oops thing

另一个标准技巧是定义一个 shell 函数,以便传递所有附加的参数:

[alias]
    showme = !"f() { case $# in 1) echo ok, $1;; *) echo usage;; esac; }; f"

$ git showme some oops thing
usage
$ git showme one
ok, one

一个有点奇怪的是使用一个虚拟的“吸收额外参数”命令:

[alias]
    showme = !"echo first arg is $1 and others are ignored; :"

$ git showme one two three
first arg is one and others are ignored

我自己的个人规则是,一旦别名变得复杂,就切换到“真正的”shell 脚本。:-)

于 2013-10-28T23:07:35.490 回答