我正在尝试创建一个全局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
答案 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'