【问题标题】:Escaping shell command in git alias在 git 别名中转义 shell 命令
【发布时间】:2015-07-22 16:07:37
【问题描述】:

我有这个命令可以删除所有不在 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 个斜线?

【问题讨论】:

    标签: git shell


    【解决方案1】:

    您可以使用不同的分隔符重写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(我没有查看别名中的命令,所以我无法判断这是否安全)。

    【讨论】:

    • 谢谢,别名终于起作用了!至于命令本身,我在网上的某个地方找到了它。到目前为止它运行良好,但我总是复制/粘贴,这很烦人。
    • 关于不直接编辑.gitconfig 的重要提示;我没有意识到如果你使用git-config 命令,git 会为你找出转义。
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2018-11-11
    • 2021-06-26
    • 2012-04-19
    相关资源
    最近更新 更多