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

假设它已经被rm删除了(不是git rm)。然后git的状态会显示:

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 rm [FILE]是正确的,你也可以使用git add -u。

根据git-add文档:

- u - - -更新 在索引已经有匹配[FILE]的条目的地方更新索引。这将删除和修改索引项以匹配 工作树,但不添加新文件。 如果在使用-u选项时没有给出[FILE],则整个工作树中所有被跟踪的文件都会被更新(使用旧版本的Git) 将更新限制到当前目录及其子目录)。

在此基础上,索引将被刷新,文件将被正确地暂存。

其他回答

使用git rm foo来执行删除文件。(这也会从文件系统中删除文件,如果它之前没有被删除的话。当然,它可以从git中恢复,因为它是之前检入的。)

要在不从文件系统中删除文件的情况下进行文件删除,请使用git rm——cached foo

即使使用git rm [FILE]是正确的,你也可以使用git add -u。

根据git-add文档:

- u - - -更新 在索引已经有匹配[FILE]的条目的地方更新索引。这将删除和修改索引项以匹配 工作树,但不添加新文件。 如果在使用-u选项时没有给出[FILE],则整个工作树中所有被跟踪的文件都会被更新(使用旧版本的Git) 将更新限制到当前目录及其子目录)。

在此基础上,索引将被刷新,文件将被正确地暂存。

你可以使用

Git rm -r——cached——"path/to/directory"

执行已删除的目录。

添加所有已删除的文件

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

谢谢确认

git status

你应该可以出发了

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

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

为命令添加别名git rm-deleted,执行:

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