git使用xargs撤消别名

时间:2010-05-05 20:43:40

标签: git alias xargs

我有一个git别名(git undo)撤消工作目录中的所有内容,包括新文件,已更改文件和已删除文件:

!git reset --hard && git ls-files -d | xargs -0 git rm --ignore-unmatch && git clean -fq

在OS X上,这很有用。但是,在Linux上,我遇到了以下问题:如果没有从存储库中删除任何文件,git ls-files -d | xargs -0 git rm --ignore-unmatch命令将失败(xargs将不会传递任何内容。)

如果xargs没有收到任何内容,是否可以让git ls-files默默继续前进?

4 个答案:

答案 0 :(得分:3)

如果前面有git reset --hard,则git ls-files -d永远不会生成任何输出(如果确实如此,您可能希望使用git ls-files -d -z让它为{生成NUL终止的输出{1}})。

完成xargs -0后,工作树的跟踪部分和整个索引将与HEAD提交相匹配。 git reset --hard只会显示索引中但不在工作树中的文件。由于工作树将具有索引所具有的内容,因此在硬重置后不应该有任何已删除的文件。

git ls-files -d位对于删除未跟踪的文件(git clean不会触及)非常有用,但您可能希望将其更改为git reset --hard以删除完全未跟踪的目录。< / p>

答案 1 :(得分:2)

来自man page

  

- no-run-if-empty,-r
  如果标准输入不包含任何非空白,请不要运行
  命令。通常,即使有中,该命令也会运行一次   没有输入。此选项是GNU扩展。

确保您的xargs版本具有该选项(man xargs

答案 2 :(得分:0)

也许你想使用xargs'“ - r”选项:

xargs -r -0 git rm --ignore-unmatch

这样,如果ls-files没有显示任何内容,则xargs根本不会调用git rm

答案 3 :(得分:0)

有“git clean”(man git-clean):从工作树中删除未跟踪的文件