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


1311

我有一个Git存储库,已从使用中删除了四个文件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 .如果可能的话,我正在寻找可以与之相同的方式工作。



10
@seth,使用起来并不总是很方便git rm,删除可能是从单独的工具,IDE或文件管理器中进行的。对于Visual Studio,删除/重新命名文件时可能会很痛苦。
Brett Ryan

67
恩,问为什么不使用某人git rm有点像问为什么不使用git vimgit cd。这是一件愚蠢的事情,git应该具有内置命令或别名以从登台中删除已删除的文件,并且您不必在午休时在SO上查找它或阅读手册页。
WCWedin

7
Varinder的答案不是一个好方法。考虑一下Cody建议的git add -u,这也是该问题的答案: stackoverflow.com/questions/1402776/…–
Roland

Answers:


2300

对于Git 1.x

$ git add -u

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

对于Git 2.0

整理整个工作树:

$ git add -u :/

要暂存当前路径:

$ git add -u .

133
请注意,这将添加所有更改,跟踪的文件-删除和更新。
伊恩·亨特

19
@beanland,如果您不希望获取所有文件,只需提供要修改的特定文件的路径。例如git add -u [path]
Paul Prewett 2012年

27
git add -u folder/运行在一个文件夹此操作
ç..

2
仅供参考:这个答案是从stackoverflow.com/questions/1402776/…
Shog9

1
这可能是人们何时到达此页面时要问的问题,这可能是OP真正要问的问题,但并不能回答所问的确切问题。
Rerequestual's

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

可能就是您想要的..它对我有用..


5
对于Windows,请尝试在配置中添加以下别名,但不要加上Evan Moran所说的引号'remove =!git ls-files --deleted -z | xargs -0 git rm'–
CLS

21
警惕名称中带有空格的文件
maazza

44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy

15
就像Cody所建议的那样,git add -u是一种更简单,更安全的方法,没有意外删除文件的风险。
罗兰2014年

4
拒绝投票,因为这可能是错误的答案,即使它可能适用于某些文件。使用下面的“ git add -u”。那就是它的目的。
n13

733

您可以使用

git add -u

要将删除的文件添加到暂存区,然后提交它们

git commit -m "Deleted files manually"

100
请注意Google用户:它将修改过的跟踪文件也添加到登台区域。
erenon'2

4
仅当您刚刚删除文件并想立即暂存它们时,才运行此命令。
阿约

1
我无法从bitbucket存储库中删除文件]
srinivas gowda

356

如果您只是运行:

git add -u

git将更新其索引,以知道您删除的文件实际上应该是下一次提交的一部分。然后,您可以运行“ git commit”以签入该更改。

或者,如果您运行:

git commit -a

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

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

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

1
是的,git commit -a可以执行我想要的操作,除了在某些情况下,我具有不想提交的文件,因此我想手动准备提交。
Igor Zevaka 09年

2
commit -a本质上首先执行“ add -u”;它将使用对已知文件的任何更改(无论是删除还是简单更改)来更新索引。当然,您可以更加具体,仅添加/删除所需的文件。git.or.cz/gitwiki/…可能会有所帮助。
埃米尔(Emil Sit)2009年

2
“更新:..”下面的命令集就像一个超级按钮一样起作用。谢谢!
杰伊·泰勒

10
非常感谢您的'git ls-files --deleted | xargs git rm'!
2012年

18
“ git ls文件--deleted | xargs git rm”是正确的答案!谢谢!
雷托

166

您可能正在寻找-A:

git add -A

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


8
简要说明一下,使用-u将添加限制到跟踪的文件,并且-a也将包括未跟踪的文件。只是以为我会指出区别。
spaaarky21 2012年

在这一阶段,您最好通过commit -a标志添加所有内容。
Zac Grierson

94

仅暂存已删除的文件:

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

您可以为首选命令集添加别名,以方便以后使用。


2
@Saeb了解队列,但xargs需要15分钟左右的时间。
埃里克·威尔逊

11
git status | awk '/deleted/ {print $3}' | xargs git rm将是一种更短的方法。 grep | awk...只是说号
马克·里德

58
git rm $(git ls-files --deleted)这不是更方便(从this复制)。
Hotschke 2013年

1
xargs或上面的$()替换(如果您知道列表不大)。如果该列表巨大的: git ls-files --deleted | while read f; do git rm $f; done
安德鲁

2
@Andrew xargs可能比while循环对于大型列表更有效,因为每次执行时都会传递多个参数git rm。要限制git rm每次执行时传递给参数的数量,请使用以下-n选项:git ls-files --deleted | xargs -n 15 git rm
Ajedi32

61
git rm test.txt

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


7
虽然可以正常工作,但我经常发现自己只是通过删除大量文件rm而后悔。
卡尔,

4
为什么这比做的还要糟糕git add -u?将已删除的特定文件添加到提交似乎比添加所有更改更安全。
伊恩·邓恩

2
实际上,根据问题的最后一行“我只想要一个命令,从git中删除所有文件,这些文件也将从磁盘中删除”,这应该是最佳答案。
2013年

2
@Ramsharan不,因为它根本不这样做。这将删除一个文件;OP特别要求“所有”已删除文件。
亚当

1
@Ramsharan不,这就是重点-在几乎所有情况下,您都不能简单地使用通配符(没有匹配的通配符)。这就是为什么主要答案如此复杂的原因。
亚当

49

通过将git-add与'--all'或'--update'选项一起使用,您可以获得的收益超出了预期。新的和/或修改的文件也将添加到索引中。当我想从git中删除已删除的文件而不触摸其他文件时,我有一个bash别名设置:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

从文件系统中删除的所有文件都将被删除后添加到索引中。


39

并不是真的很重要,但是我不同意选择的答案:

git add -u 

如果工作树中的相应文件已被删除,则...将从索引中删除文件,但是它还将上载跟踪文件的修改后的新内容。

git rm $(git ls-files --deleted)

...另一方面,只会删除已跟踪的已删除文件。

因此,我认为后者是更好的选择。


29

如果只有这些更改,则只需执行

git commit -a

提交所有更改。这将包括已删除的文件。


3
不知道为什么我会投票失败;git可以很好地识别已删除的文件,即使您没有使用git rm明确告诉它也是如此。
SpoonMeiser

您不赞成投票,因为“ -a”不是可接受的开关,而是“ -A”。编辑您的答案。
Sheharyar

10
不,“-a” 可接受的开关,因为命令为commit。“ -A”是添加但不提交的开关。我看到您建议的修改已被拒绝。
SpoonMeiser

如果您要提交的唯一内容是已删除的文件,请添加开关--allow-empty
billrichards

错误,实际上--allow-empty仅在执行git rm --cached时才需要
Billrichards

20
git ls-files --deleted | xargs git rm 

是仅添加已删除文件的最佳选择。

这是其他一些选择。

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.

16

git添加-u

-u --update仅匹配索引中已跟踪的文件,而不是工作树。这意味着它将永远不会暂存新文件,但是它将暂存已跟踪文件的修改后的新内容,并且如果已删除工作树中的相应文件,它将从索引中删除文件。

如果没有给出,默认为“。”;换句话说,更新当前目录及其子目录中的所有跟踪文件。


投票最多的答案已经说过要使用git add -u。您的答案中的所有其他内容是从何而来的?您应该链接到文档,并在引用时用引号引起来。
TheWarriorNamedFoo 2014年


11

如果要将其添加到您的.gitconfig操作中,请执行以下操作:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

然后,您要做的就是运行:

git rma

1
和cmd行git config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey

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

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

根据您的POSIX变体,您可能需要使用xargs -0 -r:这将导致xargs在通过管道传递空内容时正常退出。

编辑:--cached--deleted标志一起使用,以防止意外删除尚未删除的文件。


7

告诉命令自动暂存已修改和删除的文件,但是您未告知Git的新文件不受影响:

-a
--all

git add . && git commit -m -a "Your commit"

要么

git add --all && git commit -m "Your commit"

1
git add --all && git commit -m“您的提交”在Windows-7中,使用Git bash命令shell对我有用。
kmarabet 2015年

1
以下命令在Windows-7中使用Git bash命令外壳为我工作:$ git add --all && git commit -m“删除属性文件” [master 58c41ac]删除属性文件1个文件已更改,9个删除(-)。 ..然后将已提交的更改推送到远程存储库中,请运行:$ git push origin ..计数对象:10,已完成。
kmarabet 2015年

6

即使您有很多文件要处理,也可以执行以下操作:

git ls-files --deleted | xargs git rm

您可能还想发表评论。

有关详细信息,请参见: 有用的Git脚本


6

请使用-t查看实际正在运行的命令

我只是调整了Virender的答案来做同样的事情:

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

5

git-add的标志都不会仅暂存已删除的文件;如果您所有修改过的文件都是已删除的文件,那么就可以了,但是否则,您需要运行git-status并解析输出。

根据杰里米的答案,这就是我得到的:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. 获取文件状态。
  2. 对于已删除的文件,隔离文件名。
  3. 删除所有以#s开头的行以及其中带有单词“ deleted”的状态行;我不记得它到底是什么了,而且已经不存在了,因此您可能不得不针对不同情况进行修改。我认为表达式分组可能是GNU特定的功能,因此,如果您不使用gnutils,则可能必须添加多grep -v行。
  4. 将文件传递到git rm

现在将其粘贴在shell别名中...


5

如之前提到

git add -u

暂存已删除的文件以进行删除,但也要修改文件以进行更新。

要取消登台已修改的文件,您可以执行

git reset HEAD <path>

如果您想保持提交的条理和整洁。
注意:这也可能会使已删除的文件恢复暂存状态,因此请小心使用这些通配符。


4
git commit -m 'commit msg' $(git ls-files --deleted)

在我删除文件后,这对我有用。


3

我需要相同的内容,并使用git gui“阶段更改”按钮。它还添加了所有内容。

在“阶段改变”之后,我做出了“提交” ...

所以我的工作目录又干净了。


好吧,使用gui可以作弊,大声笑!但是,在GUI设计人员满足您的需求的情况下,速度更快。很高兴知道如何修改“引擎盖下的内容”。
丹尼斯

1
仅供参考:这个答案是从stackoverflow.com/questions/1402776/…
Shog9

3
git rm $(git ls-files -d)

删除git ls-files命令列出的所有文件(-d仅显示已删除的文件)。不适用于文件名或路径中带有空格的文件,但易于记住


2

您只能用于git add -u <filenames>暂存已删除的文件。

例如,如果删除了文件templates/*.tpl,则使用git add -u templates/*.tpl

-u需要以指存在于存储库,但在工作目录中不再存在的文件。否则,默认值git add是在工作目录中查找文件,如果您指定已在其中删除的文件,则找不到它们。


2

添加系统别名以暂存已删除文件作为命令 rm-all

UNIX系统 alias rm-all='git rm $(git ls-files --deleted)'

视窗 doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

注意

Windows需要已bash安装。


2

(还有另一种变化)

我想从磁盘文件中删除所有已删除的内容,但要从一个特定的文件夹中删除所有其他文件夹。以下为我工作:

git ls-files --deleted  | grep <folder-name> | xargs git rm

1

就像是

git status | sed -s "s/^.*deleted: //" | xargs git rm 

可以做到。


2019 git版本2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841 '19

1

用于Visual Studio项目

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

当删除的文件路径有空间时,这很有用


-1

迄今为止,我发现最灵活的解决方案是

git cola

并选择我要登台的所有已删除文件。

(请注意,我通常在git中执行命令行的所有操作,但是git处理已删除的文件有点尴尬)。


通配符不适用于我,git add -u path/to/my/deleted-files-pattern-*.yml因此这对我来说是最好的答案(不想暂存所有已删除的文件,但不想存储所有文件中的50个)。
mlncn '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.