567

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

假设它已用rm(not git rm) 删除。然后 git status 将显示:

Changes not staged for commit:

    deleted: foo

如何暂存此单个文件删除?

如果我尝试:

git add foo

它说:

'foo' did not match any files.

更新(9年后,哈哈):

这看起来已经在 git 2.x 中修复了:

$ git --version
git version 2.25.1

$ mkdir repo

$ cd repo

$ git init .
Initialized empty Git repository in repo/.git/

$ touch foo bar baz

$ git add foo bar baz

$ git commit -m "initial commit"
[master (root-commit) 79c736b] initial commit
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
create mode 100644 baz
create mode 100644 foo

$ rm foo

$ git status
On branch master
Changes not staged for commit:
    deleted: foo

$ git add foo

$ git status
On branch master
Changes to be committed:
    deleted:    foo
4

10 回答 10

563

用于git rm foo暂存文件以进行删除。(这也会从文件系统中删除该文件,如果它之前没有被删除。当然,它可以从 git 中恢复,因为它之前已签入。)

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

于 2012-09-11T16:02:24.133 回答
452

即使使用是正确的git rm [FILE],或者,您也可以使用git add -u.

根据git-add文档:

-u --更新

更新已经有匹配 [FILE] 条目的索引。这会删除并修改索引条目以匹配工作树,但不会添加新文件。

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

之后将刷新索引并正确暂存文件。

于 2012-09-11T16:36:45.327 回答
187

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

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

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

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
于 2015-12-24T16:26:51.360 回答
48

从 Git 2.0.0 开始,git add也将暂存文件删除。

Git 2.0.0 文档 - git-add

<路径规范>…</p>

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

于 2017-03-27T20:52:11.853 回答
35

添加所有已删除的文件

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

感谢检查以确保

git status

你应该很高兴

于 2015-12-09T15:28:00.353 回答
24

你可以使用这个命令

git add `git ls-files --deleted`

解释:

git ls-files --deleted- 此命令将返回所有已删除文件的文件名。

于 2019-11-13T13:14:03.320 回答
10

您可以使用

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

暂存已删除的目录。

于 2015-01-16T14:34:20.050 回答
4

对于那些在 powershell 中使用 git 2.x+ 的人:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
于 2020-04-21T20:24:56.177 回答
4

Ian Mackinnon 找到了答案,但使用 xargs 效果更好:

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

作为 git 别名:

git config --global alias.rm-deleted '!git ls-files --deleted -z | xargs -r0 git rm'

这使用带有 NUL 终止的 xargs(保证不会出现在路径中的唯一字节)以及git rm如果文件列表为空则不运行的选项。

这种语法也兼容鱼。

于 2020-08-20T18:45:01.680 回答
4

如果您只想将所有已删除的文件添加到阶段,那么您可以使用git add .

这是目前使用 git 最简单的方法v2.27.0。请注意,使用*.是不同的方法。使用git add *只会添加当前存在的文件,而git add .还会暂存使用rm命令删除的文件。

很明显但值得一提的是,当您使用git add ..

于 2021-02-09T19:55:12.623 回答