在git别名中转义shell命令

时间:2015-07-22 16:07:38

标签: git shell

我有这个命令删除了不再在repo中的所有本地分支,我试图在.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\///'

正在使别名中断。如果删除此部分,则执行命令(但它只删除每个分支,而不是保留一个仍然在repo上),并且没有错误

有关如何逃脱的任何帮助?

额外的,但不是必须的,如果你能解释一下别名的部分是什么以及为什么有3个斜杠?

1 个答案:

答案 0 :(得分: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(我没有查看别名内的命令,所以我不知道这是否安全)。