暂存已删除的文件


499

假设我的git储存库中有一个名为的文件foo

假设已使用rm(不是git rm)将其删除。然后git status将显示:

Changes not staged for commit:

    deleted: foo

如何分阶段删除单个文件?

如果我尝试:

git add foo

它说:

'foo' did not match any files.

2
这是旧版Git中的问题吗?如今,它似乎不是一个,它的工作原理类似于修改后的文件。
cst1992 '16

Answers:


22

从Git 2.0.0开始,git add还将逐步删除文件。

Git 2.0.0文档-git-add

<pathspec>…

从中添加内容的文件。可以指定Fileglob(例如* .c)来添加所有>匹配文件。也可以给出一个领先的目录名(例如,用于添加dir / file1和dir / file2的dir)以更新索引以匹配整个目录的当前状态(例如,指定dir将不仅仅记录已修改的文件dir / file1在工作树中,将文件dir / file2添加到工作树中,并且还将文件dir / file3添加到工作树中,请注意,较早版本的Git曾经忽略已删除的文件;如果您使用--no-all选项,想要添加修改的文件或新文件,但忽略已删除的文件。


可接受的答案不能解决问题-另一个因为Git 2.0.0而比较麻烦-这是最好的方法!你有我给予好评
若昂·安图内斯

518

使用git rm foo阶段性删除该文件。(如果以前没有将其删除,那么这也会从文件系统中删除该文件。由于先前已将其检入,因此当然可以从git中还原它。)

要暂存要删除的文件而不将其从文件系统中删除,请使用 git rm --cached foo


8
您也可以添加--cache标志以仅从存储库中删除文件,而在文件系统中保持不变。
Hauleth 2012年

撤消此操作的过程是什么,即取消暂存要删除的文件?那可能吗?
隆达

82
实际上,OP询问了如何暂存has_deleted文件,这可以通过来完成git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}"。其他答案似乎正在显示如何正确地暂存文件(而不是如何暂存已删除的文件)。ps。在xargs基于命令为我工作在Ubuntu 12.04,但是当我做手工git add -u deleted_file.txt它好好尝试的工作。我的git是1.7.9.5
Dimitry K

8
@DimitryK:git rm即使已经从文件系统中删除了文件,也会很高兴地将其删除。正如OP对另一个答案的评论所指出的那样,他们希望暂存一个已删除的特定文件。
Wooble

3
git rm不会暂存已删除的文件。它将引发此错误:fatal: pathspec '~.SLDASM' did not match any files。以下是带有证明的屏幕:i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png。第一个屏幕截图清楚地显示了2个文件已被删除而不是暂存,第二个屏幕截图显示了当我键入时git rm "~$Box.SLDASM",它引发了此错误。
库拉金

413

即使使用是正确的git rm [FILE],也可以这样做git add -u

根据git-add文档:

-u-更新

在索引已具有与[FILE]匹配的条目的地方更新索引。这会删除和修改索引条目以匹配工作树,但不会添加任何新文件。

如果在使用-u选项时未提供[FILE],则将更新整个工作树中的所有跟踪文件(旧版本的Git用于将更新限制为当前目录及其子目录)。

索引将在此刷新,文件将被适当地暂存。


56
是的,git add -A .将添加所有更改,我特别想暂存一个已删除的文件。
安德鲁·托马佐斯

25
这将添加所有修改的文件;不只是删除的文件。
永远

3
那是正确的。更具体地说,它将暂存已跟踪文件中的所有更改,无论是删除还是修改。当您删除多个文件并且不想单独暂存它们时,这会有所帮助。
Sailesh 2014年

9
有没有办法只暂存已删除的文件而不进行修改?只是好奇。
2014年8

11
我做到了git add -u FolderWithDeletedFiles/,它做了我想要的,谢谢
议会

158

要暂存所有手动删除的文件,可以使用:

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

要将别名添加为git rm-deleted,请运行:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'

2
在$()符号aparently不存在于Windows来砸控制台,导致unknown option `deleted)
费利克斯·加侬-格尼尔

2
如果您在路径中也有空格,我也不认为这可行。至少,它不在我的系统上(使用zsh)。
Wil Shipley

3
为我完美地工作!确实满足了我的需求。非常感谢!
RedSands

在Windows中执行for /F %I in ('git ls-files --deleted') do git add -u %I
eis

3
这不适用于带空格的文件名,如果需要,可以使用'git add -u'。
J-Dizzle

33

添加所有准备好的已删除文件

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all

感谢检查以确保

git status

你应该很好去


5
确认这有效。我认为这里的课程虽然不是要做的rm <file>,而是git rm <file>
DanGordon

1
仅供参考:削减空间会导致问题,如果路径中有空间
戴维斯(David Davis)2017年

1
这不适用于带空格的文件名,如果需要,可以使用'git add -u'。
J-Dizzle

对我来说完美git version 2.15.2 (Apple Git-101.1)
卡洛夫·陶里安

在Linux控制台上完美工作!
艾哈迈德AMMOURI,

8

您可以使用

git rm -r --cached -- "path/to/directory"

暂存已删除的目录。



0

对于在Powershell中使用git 2.x +的用户:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
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.