gpt4 book ai didi

git - 在 git 别名中转义 shell 命令

转载 作者:太空狗 更新时间:2023-10-29 13:40:27 27 4
gpt4 key购买 nike

我有这个命令删除所有不再在 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 协议(protocol)中),并且没有错误

对我如何逃脱有什么帮助吗?

额外的,但不是必需的,如果你能解释别名的那部分是做什么的以及为什么有 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(我没有检查别名中的命令,所以我无法判断这是否安全)。

关于git - 在 git 别名中转义 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31568440/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com