暂存已删除的文件

问题描述 投票:0回答:11

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

foo
的文件。

假设它已被

rm
(而不是
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
git git-add git-rm git-stage
11个回答
602
投票

使用

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

要暂存文件以进行删除而不从文件系统中删除它,请使用

git rm --cached foo


488
投票

尽管使用

git rm [FILE]
是正确的,但您也可以这样做
git add -u

根据

git-add
文档:

-u --更新

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

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

届时将刷新索引并正确暂存文件。


210
投票

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

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

要为此命令添加别名

git rm-deleted
,请运行:

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

52
投票

从 Git 2.0.0 开始,

git add
也会暂存文件删除。

Git 2.0.0 文档 - git-add

< pathspec >…

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


49
投票

您可以使用此命令

git add `git ls-files --deleted`

说明:

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


39
投票

添加所有已删除的文件

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

感谢检查以确保

git status

你应该可以走了


11
投票

你可以使用

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

暂存已删除的目录。


7
投票

如果您想简单地将所有已删除的文件添加到阶段,那么您可以使用

git add .

这是目前使用 git 的最简单方法

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

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

git add .
时,其他已修改的文件也会添加到暂存区。


6
投票

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

此语法也与鱼兼容。


5
投票

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

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }

0
投票

这对我有用:

git status | grep 'deleted:' | cut -d':' -f2  | xargs -t   -I {}  git add  -u "{}"

来源

© www.soinside.com 2019 - 2024. All rights reserved.