【问题标题】:Chaining git clean (Porcelain) command链接 git clean (Porcelain) 命令
【发布时间】:2020-11-25 14:15:15
【问题描述】:

我试图对一些未跟踪的文件执行 git clean。我无意中输入了以下命令:

git clean -dn | grep -v <files_to_exclude> | git clean -df

请注意,该行似乎缺少xargs。也就是说,我通常会这样编写前面的命令:

git clean -df | grep -v <files_to_exclude> | xargs git clean -df --

话虽如此,前者有效,后者无效!是的,我知道我本来可以使用:

git clean -df --exclude=<files_to_exclude>

那时我还不知道排除选项。

为了确保您拥有正确的图片,假设您有三个未跟踪的文件 xyz,并且您要排除 x

$ git clean -dn | grep -v x
Would remove y
Would remove z

将这个输出直接连接到 xargs 而不省略“将删除”部分是错误的并且会导致 git clean 中断是有意义的。

现在的问题是:为什么直接将此输出连接到 git clean 它仍然有效?

【问题讨论】:

    标签: git chaining git-clean git-plumbing


    【解决方案1】:
    • “前者有效”:它的行为与git clean -df &lt;no extra args&gt; 完全相同,它会清除所有文件,而不仅仅是您想要包含的文件...
    • “后者没有”:[编辑] 在我的机器上运行它,“它可以工作”(需要注意的是 grep 实际上会匹配完整的消息而不是文件名,所以运行 grep -v Would 例如排除所有行,如果输出为空,则返回git clean -df,它再次删除全部而不是什么......)
      您在您的案例中发现了什么错误?

    【讨论】:

    • 你是对的。 git clean 就像没有管道输入一样工作并清理了所有文件。所以,这意味着 git clean 当它不理解输入时,它的行为就像没有任何输入一样?
    • 一些命令从不读取它们的标准输入。 echo foo | echo bar 将按预期输出bar,并且从不读取其标准输入
    • 明白了。你又是对的。我的错错过了这个。
    • @joker:特别强调“空标准输入”部分:如果标准输入为空,则运行... | grep -v . | xargs git clean -fd -- 等效于git clean -fd &lt;no extra args&gt;
    • 如果您的某个脚本中碰巧有xargs ... 变体,请确保修复错误...
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多