我有一个Git repo,我用rm(不是Git rm)删除了四个文件,我的Git状态是这样的:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

我如何从Git中删除这些文件,而不需要手动查看并添加每个文件,就像这样:

git rm file1 file2 file3 file4

理想情况下,我正在寻找与git添加的方式相同的东西。是的,如果可能的话。


当前回答

git ls-files --deleted -z | xargs -0 git rm --cached

这将删除所有之前被git跟踪的已删除文件,以及处理文件名中有空格的情况。

根据POSIX变量的不同,您可能需要使用xargs -0 -r:这将导致xargs在管道输出空内容时优雅地退出。

EDIT:——cached和——deleted标志一起使用,以防止意外删除尚未删除的文件。

其他回答

git ls-files --deleted -z | xargs -0 git rm 

也许这就是你正在寻找的。这对我有用。

git rm $(git ls-files -d)

删除git ls-files命令列出的所有文件(-d show only deleted files)。不适用于文件名或路径中有空格的文件,但易于记忆

首先使用该命令可以在Git中提交所有已删除的文件 Git add -u来执行删除的文件,然后使用Git commit -m "message"来提交更改,并附上描述提交的消息。git add命令中的-u标志将执行所有已删除的文件,以及工作目录中的任何其他更改。

git-add的任何标志都不会只执行已删除的文件;如果所修改的都是已删除的文件,那么就没问题,但除此之外,还需要运行git-status并解析输出。

根据杰里米的回答,我得出了以下结论:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm

获取文件的状态。 对于已删除的文件,请隔离文件名。 删除所有以#s开头的行,以及包含“deleted”字样的状态行;我不记得具体是什么了,现在已经不存在了,所以你可能需要根据不同的情况修改这个。我认为表达式分组可能是特定于gnu的特性,因此如果不使用gnutils,则可能必须添加多个grep -v行。 将文件传递给git rm。

把这个放在一个shell别名现在…

对于visual studio项目

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

当删除的文件路径有空间时,哪个是有用的