题 从已从磁盘中删除的Git存储库中删除多个文件


我有一个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 add . 是的,如果可能的话。


1229
2018-01-29 17:18


起源


有关: stackoverflow.com/questions/1856654/... - kch
@seth,使用起来并不总是方便 git rm,删除可能来自一个单独的工具,IDE或文件管理器。删除/重命名文件时,Visual Studio for one可能会很麻烦。 - Brett Ryan
呃,问为什么有人不使用 git rm 有点像问他们为什么不使用 git vim 要么 git cd。这是一个愚蠢的事情,git应该有一个内置的命令或别名来从暂存中删除已删除的文件,你不应该在SO上查找它或在午休时阅读手册页。 - WCWedin
Varinder的答案不是一个好方法。考虑Cit建议的git add -u,这也是这个问题的答案: stackoverflow.com/questions/1402776/... - Roland
可能重复 如何使用“rm”而不是“git rm”添加和提交删除?


答案:


对于Git 1.x.

$ git add -u

这告诉git自动暂存跟踪的文件 - 包括删除以前跟踪的文件。

对于Git 2.0

分阶段整个工作树:

$ git add -u :/

仅仅暂存当前路径:

$ git add -u .

2206
2017-09-10 00:13



请注意,这将添加 所有 更改,跟踪文件 - 删除和更新。 - Ian Hunter
@beanland,如果您不想让它们全部获取,您只需要提供要修改的特定文件的路径。例如git add -u [path] - Paul Prewett
也 git add -u folder/ 在文件夹中运行此操作 - c..
仅供参考:这个答案合并而来 stackoverflow.com/questions/1402776/... - Shog9♦
这应该是公认的答案 - arainone


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

可能是你在找什么..它对我有用..


1336
2018-02-28 20:21



请注意,此答案不适用于Windows:/ - Phrogz
警惕名字中有空格的文件 - maazza
试图在Windows gitbash ..工作非常好。 +1。 - Vijay C
@DaveEveritt git ls-files --deleted -z | xargs -0 git rm - Max Nanasy
git add -u正如Cody建议的那样,这是一种更简单,更安全的方式,没有意外删除文件的风险。 - Roland


您可以使用

git add -u

要将已删除的文件添加到暂存区域,请提交它们

git commit -m "Deleted files manually"

725
2018-01-29 17:25



请注意Google用户:它还会将修改后的跟踪文件添加到暂存区域。 - erenon
仅当您刚删除文件并想立即暂存时才运行此命令。 - Aryo
我无法从bitbucket repo中删除文件] - srinivas gowda


如果您只是运行:

git add -u

git将更新其索引,以便知道您删除的文件实际上应该是下一次提交的一部分。然后你可以运行“git commit”来检查那个变化。

或者,如果您运行:

git commit -a

它将自动进行这些更改(以及任何其他更改)并提交它们。

更新:如果您只想添加已删除的文件,请尝试:

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

354
2017-09-10 00:15



对, git commit -a 会做我想要的,除了在某些情况下我有我不想提交的文件,所以我想手动准备提交。 - Igor Zevaka
commit -a首先执行“add -u”;它将使用已知文件的任何更改来更新索引(无论是删除还是简单更改)。您当然可以更具体,只添加/ rm您想要的文件。 git.or.cz/gitwiki/... 可能会有所帮助。 - Emil Sit
“Update:..”下面的命令集就像一个魅力。谢谢! - Jay Taylor
非常感谢'git ls-files --deleted | xargs git rm'! - mit
“git ls-files --deleted | xargs git rm”是正确答案!谢谢! - reto


你可能正在寻找-A:

git add -A

这类似于git add -u,但也添加了新文件。这大致相当于hg addremove 命令(尽管移动检测是自动的)。


163
2018-01-29 18:10



在快速注释中,使用-u限制添加到跟踪文件,-a也包括未跟踪文件。只是想我会指出差异。 - spaaarky21
在这个阶段,你也可以通过commit -a标志添加all。 - Zac Grierson


上台 只删除了 文件:

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

或者(xargs方式):

git status | awk '/deleted/ {print $2}' | xargs git rm

您可以 别号 您喜欢的命令集,以方便以后使用。


92
2017-11-26 10:34



@Saeb了解队列,但是 xargs 掌握约15分钟。 - Eric Wilson
git status | awk '/deleted/ {print $3}' | xargs git rm 这将是一个更短的方式来做到这一点。 grep | awk... 拒绝吧。 - Mark Reed
git rm $(git ls-files --deleted) 这不是更方便(复制自 这个)。 - Hotschke
如果你知道列表不是很大,那么xargs或上面的$()替换。如果列表 是 巨大: git ls-files --deleted | while read f; do git rm $f; done - Andrew
更优雅:git status | awk '/deleted/{print "git rm " $3}' | sh - Jakub M.


git rm test.txt

在删除实际文件之前或之后。


59
2017-09-10 00:13



虽然它可以工作,但我经常发现自己只是通过删除大量文件 rm 并后悔。 - carl
为什么这比做的更糟糕 git add -u?将添加的特定文件添加到提交中,而不是添加,似乎更安全 所有 变化。 - Ian Dunn
实际上,根据问题的最后一行,这应该是最佳答案“我只想要一个删除git中所有文件的命令,这些文件也会从磁盘中删除。” - Ramsharan
@Ramsharan没有,因为它根本不这样做。这会删除单个文件; OP明确要求“全部”删除文件。 - Adam
@Ramsharan不,这就是重点 - 几乎在所有情况下你都不能简单地使用通配符(没有匹配的通配符)。这就是为什么主答案要复杂得多。 - Adam