【问题标题】:Staging Deleted files暂存已删除的文件
【发布时间】:2012-09-04 14:54:06
【问题描述】:

假设我的 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 版本的问题吗?现在它似乎不是一个,它的工作方式类似于修改后的文件。
  • @cst1992:是的,现在看起来已经修复了。 git add foo 现在可以使用了。请参阅更新。

标签: git git-add git-rm git-stage


【解决方案1】:

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

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

【讨论】:

  • 您也可以添加--cache 标志以仅从存储库中删除文件,而在文件系统中保持不变。
  • 实际上 OP 询问如何暂存 already_deleted 文件,这可以通过 git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}" 完成。其他答案似乎显示如何正确暂存文件删除(但不是如何暂存已删除的文件)。附言。基于 xargs 的命令在 Ubuntu 12.04 上适用于我,但是当我手动执行 git add -u deleted_file.txt 时它不起作用。我的 git 是 1.7.9.5
  • @DimitryK: git rm 将愉快地暂存一个文件以供删除,即使它已经从文件系统中删除。正如 OP 对另一个答案的评论所指出的那样,他们想要暂存一个已被删除的特定文件。
  • git rm 不会暂存已删除的文件。它抛出此错误:fatal: pathspec '~.SLDASM' did not match any files。这是带有证明的屏幕:i.imgur.com/cKNKGGe.pngi.imgur.com/1p9JdWF.png。第一张截图清楚地显示了2个文件被删除并且没有暂存,第二张截图显示当我输入git rm "~$Box.SLDASM"时,它会抛出这个错误。
  • @KulaGGin:阅读错误信息。它不是试图删除名称中带有“$Box”的文件,因为您的 shell 为您摆脱了它。如果您要拥有名称可怕的文件,请添加更多引号。
【解决方案2】:

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

根据git-add 文档:

-u --更新

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

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

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

【讨论】:

  • 是的git add -A . 将添加所有更改,我特别想暂存一个已删除的文件。
  • 这将添加所有修改过的文件;不仅仅是删除的文件。
  • 没错。更具体地说,它将暂存已跟踪的文件中的所有更改,无论是删除还是刚刚修改。当您删除多个文件并且不想单独暂存它们时,这会有所帮助。
  • 有没有办法只暂存已删除的文件而不进行修改?只是好奇。
  • 我做了git add -u FolderWithDeletedFiles/,它做了我想要的,谢谢
【解决方案3】:

你可以使用

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

暂存已删除的目录。

【讨论】:

    【解决方案4】:

    添加所有已删除的文件

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

    感谢检查以确保

    git status
    

    你应该很高兴

    【讨论】:

    • 确认这有效。我认为这里的教训是不要做rm <file>,而是git rm <file>
    • 仅供参考:如果任何路径中有空格,则剪切空格会导致问题
    • 这不适用于带有空格的文件名,如果需要,可以使用 'git add -u'。
    • git version 2.15.2 (Apple Git-101.1) 上非常适合我。
    【解决方案5】:

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

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

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

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

    【讨论】:

    • Windows bash 控制台中显然不存在 $() 符号,导致 unknown option `deleted)
    • 如果路径中有空格,我认为这也行不通。至少,它不在我的系统上(使用 zsh)。
    • 非常适合我!做了我需要的。非常感谢!
    • 在windows中做for /F %I in ('git ls-files --deleted') do git add -u %I
    • 这不适用于带有空格的文件名,如果需要,可以使用 'git add -u'。
    【解决方案6】:

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

    Git 2.0.0 Docs - git-add

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

    【讨论】:

    • 接受的答案并不能解决问题-自Git 2.0.0以来,另一个更麻烦-这是最好的方法!你有我的赞成票
    • 对此有一个重要的警告:git add foo/*/deleted.file 之类的东西不起作用,因为* 只扩展为仍然存在的文件。不过,您可以使用不依赖于现有文件的其他模式,例如 git add foo/{bar,baz,quux}/deleted.file
    • @IMSoP 如果文件已从位于foo/*/deleted.file 的文件系统中删除,您还可以通过在路径周围加上单引号(包括通配符)将它们暂存以进行删除。这可以防止操作系统尝试扩展通配符,而是 git 扩展它并暂存已删除的文件:git add 'foo/*/deleted.file'
    【解决方案7】:

    你可以使用这个命令

    git add `git ls-files --deleted`
    

    说明:

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

    【讨论】:

    • 这正是我需要的
    • 文件名有空格时不起作用
    • ++解释
    【解决方案8】:

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

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

    【讨论】:

      【解决方案9】:

      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 的选项。

      这种语法也兼容鱼。

      【讨论】:

        【解决方案10】:

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

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

        很明显但值得一提的是,当您使用git add .时,其他已修改的文件也会添加到暂存区。

        【讨论】:

          猜你喜欢
          • 2020-11-04
          • 2017-08-26
          • 2012-03-24
          • 2014-09-14
          • 2011-05-14
          • 1970-01-01
          • 2015-03-14
          • 2018-12-18
          • 2021-01-19
          相关资源
          最近更新 更多