在git别名中转义Shell命令

4

我有一个命令,可以删除所有不再存储库中的本地分支,我正在尝试将其添加到.gitconfig中:

git checkout master && git fetch -p && git branch -l | sed 's/* master//' > /tmp/gitlocal.txt && git branch -r | sed 's/origin\///' > /tmp/gitremote.txt && grep -Fxv -f /tmp/gitremote.txt /tmp/gitlocal.txt | xargs git branch -D

我试图将它作为别名放置,但是我遇到了一些转义问题。
cleanbranches = "!f() { git checkout master && git fetch -p && git branch -l | sed 's/* master//' > /tmp/gitlocal.txt && git branch -r | sed 's/origin\///' > /tmp/gitremote.txt && grep -Fxv -f /tmp/gitremote.txt /tmp/gitlocal.txt | xargs git branch -D; }; f"

经过一些试验和错误,我得出结论:

sed 's/origin\///'

这个别名似乎出了问题。如果我删除这一部分,命令就可以执行(但只是删除每个分支,而不是保留仓库中仍然存在的那一个分支),并且没有错误。

请问如何避免这种情况?

另外,如果方便的话,请解释一下这个别名的作用以及为什么有三个斜杠?

1个回答

3

您可以使用不同的分隔符重写sed 's/origin\///',例如:sed 's|origin/||'(此命令从输入中删除子字符串origin/)。

因此,可以使用以下命令设置别名:

git config --global alias.cleanbranches '!git checkout master && git fetch -p && git branch -l | sed "s/* master//" > /tmp/gitlocal.txt && git branch -r | sed "s|origin/||" > /tmp/gitremote.txt && grep -Fxv -f /tmp/gitremote.txt /tmp/gitlocal.txt | xargs git branch -D'

我不建议直接编辑.gitconfig,因为很难正确转义。我还删除了函数包装器 (f() { ...; }; f),因为我认为它不是必需的。

我也不建议以这种自动化方式使用git branch -D(我没有审核别名内的命令,所以无法确定是否安全)。


谢谢,别名终于起作用了!至于命令本身,我在网上找到了它。到目前为止一直很好用,但是我总是复制/粘贴,这很烦人。 - wsalame
关于不直接编辑.gitconfig的提示很好;如果您使用git-config命令,我之前没有意识到git会为您解决转义问题。 - Andy Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接