我有一个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
默默继续前进?
答案 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):从工作树中删除未跟踪的文件