Git别名有多个命令和参数

时间:2015-06-28 12:02:09

标签: git

我正在尝试创建一个全局git别名,以在一个命令中删除分支的本地和远程副本。我希望别名采取以下输入:

$ git purge myBranch

并生成以下命令:

$ git branch -d myBranch
$ git push origin --delete myBranch

在许多其他尝试中,我尝试过这个:

$ git config alias.purge '!sh "git branch -d $1; git push origin --delete $1"'

但是我收到了这个错误:

sh: 0: Can't open git branch -d myBranch; git push origin --delete myBranch
fatal: While expanding alias 'purge': 'sh "git branch -d $1; git push origin --delete $1"': No such file or directory

如何创建一个接受参数的全局git别名,并以这种方式将其转发到两个单独的git命令?

更新

Per @ Chris'建议我尝试了以下内容:

git config --global alias.purge '!git branch -d $1 && git push origin --delete $1'

结果如下:

$ git purge test
warning: deleting branch 'test' that has been merged to
         'refs/remotes/origin/test', but not yet merged to HEAD.
Deleted branch test (was 1316434).
error: dst ref refs/heads/test receives from more than one src.
error: failed to push some refs to 'git@github.com:testrepo/repo.git'

如果我直接运行命令,我已经确认这是正常的:

$ git branch -d test && git push origin --delete test
warning: deleting branch 'test' that has been merged to
         'refs/remotes/origin/test', but not yet merged to HEAD.
Deleted branch test (was b610eca).
To git@github.com:testrepo/repo.git
 - [deleted]         test

1 个答案:

答案 0 :(得分:4)

修改

在大多数情况下,我的原始答案可能会起作用,但看起来位置参数$1的重复会产生奇怪的倍增效应。

例如:

git config --global alias.foo '!echo $1 && echo $1'
git foo bar
# bar
# bar bar

在这种情况下,似乎旧的shell function technique效果更好:

git config alias.purge '!f() { git branch -d $1 && git push origin --delete $1; }; f'

这种技术过去很常见,但became unnecessary for most use cases sometime before 1.8.2.1

原始回答:

我的~/.gitconfig文件中有一个类似的别名。我没有调用sh,它使用&&而不是;来确保第二个命令仅在第一个命令成功时运行。

这样的事情对你有用:

[alias]
        purge = "git branch -d $1 && git push origin --delete $1"

使用git config

git config alias.purge '!git branch -d $1 && git push origin --delete $1'