0

我有一个 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

4 回答 4

3

git reset --hard它之前,git ls-files -d应该永远不会生成任何输出(如果确实如此,您会希望使用git ls-files -d -z它为 生成以 NUL 结尾的输出xargs -0)。

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

git clean位对于删除未跟踪的文件(git reset --hard不会触及)很有用,但您可能希望将其更改git clean -dfq为也删除完全未跟踪的目录)。

于 2010-05-05T21:18:17.503 回答
2

手册页

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

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

于 2010-05-05T20:47:32.153 回答
0

也许您想使用 xargs 的“-r”选项:

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

这样,如果ls-files什么都不显示,则 xargs 根本不会调用git rm

于 2010-05-05T20:58:30.503 回答
0

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

于 2011-09-27T09:17:09.487 回答