暂存已删除的文件

And*_*zos 454 git git-add git-stage git-rm

假设我的git repostiory中有一个文件叫做foo.

假设它已被删除rm(不是git rm).然后git状态将显示:

Changes not staged for commit:

    deleted: foo
Run Code Online (Sandbox Code Playgroud)

如何暂存此单个文件?

如果我尝试:

git add foo
Run Code Online (Sandbox Code Playgroud)

它说:

'foo' did not match any files.
Run Code Online (Sandbox Code Playgroud)

Woo*_*ble 473

使用git rm foo阶段性删除该文件.(这也将删除文件系统中的文件,如果以前没有删除过.当然,它可以从git中恢复,因为之前已经签入过.)

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

  • 实际上OP询问如何暂存_already_deleted_文件,这可以通过`git status |来完成 grep'已删除:'| 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 (73认同)
  • 您还可以添加`--cache`标志,仅从存储库中删除文件,并在文件系统中保留untouch. (8认同)
  • @DimitryK:`git rm`会愉快地暂存一个文件,即使它已经从文件系统中删除了.正如OP对另一个答案的评论指出的那样,他们想要暂存一个已被删除的特定文件. (7认同)
  • git rm不会暂存已删除的文件。它将引发此错误:`fatal:pathspec'〜.SLDASM'与任何文件都不匹配。以下是带有证明的屏幕:https://i.imgur.com/cKNKGGe.png https://i.imgur.com/1p9JdWF.png。第一个屏幕截图清楚地显示了2个文件已被删除且未暂存,第二个屏幕截图显示了当我键入`git rm“〜$ Box.SLDASM”`时,它将引发此错误。 (3认同)
  • @KulaGGin:阅读错误消息。它不会尝试删除名称中包含“$Box”的文件,因为您的 shell 已经为您删除了该文件。如果您的文件名称很糟糕,请添加更多引号。 (2认同)

Sai*_*esh 388

你可以做到git rm [FILE].

如果您想要删除多个文件而不执行git add -u每个文件,这将有所帮助.

  • 是的`git add -A .`将添加所有更改,我特意想要暂存一个已删除的文件. (49认同)
  • 这将添加所有修改过的文件; 不只是删除文件. (23认同)
  • 有没有办法只删除已删除的文件而不进行修改?只是好奇. (9认同)
  • 我做了`git add -u FolderWithDeletedFiles /`,它做了我想要的,谢谢 (9认同)
  • 那是正确的.更具体地说,它将暂存已经跟踪的文件中的所有更改,无论是删除还是仅修改.当您删除多个文件而不想单独进行分段时,这会有所帮助. (3认同)

Ian*_*non 147

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

git rm $(git ls-files --deleted)
Run Code Online (Sandbox Code Playgroud)

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

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
Run Code Online (Sandbox Code Playgroud)

  • 如果您的路径中有空格,我认为这也行不通。至少,它不在我的系统上(使用 zsh)。 (3认同)
  • 这不适用于带空格的文件名,如果需要,可以使用'git add -u'。 (3认同)
  • 次要,但我只是用“git add”替换“git rm”,因为文件已经被删除,我只是更新索引。 (3认同)
  • 在Windows bash控制台中,$()符号显然不存在,导致`unknown option \`deleted)` (2认同)
  • 为我工作完美!完全符合我的需要.非常感谢! (2认同)

小智 33

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

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all
Run Code Online (Sandbox Code Playgroud)

谢谢检查以确保

git status
Run Code Online (Sandbox Code Playgroud)

你应该好好去

  • 确认这是有效的.我认为这里的教训是不要做`rm <file>`,而是`git rm <file>` (3认同)
  • 仅供参考:如果任何路径中有空格,则切割空格会导致问题 (2认同)
  • 这不适用于带空格的文件名,如果需要,'git add -u' 可以。 (2认同)

Gna*_*yam 19

你可以使用这个命令

git add  `git ls-files --deleted`
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所需要的 (2认同)

pef*_*cio 13

从Git 2.0.0开始,git add也将删除文件.

Git 2.0.0 Docs - git-add

<pathspec> ...

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

  • @IMSoP 如果文件已从“foo/*/deleted.file”的文件系统中删除,您还可以通过在路径周围添加单引号(包括通配符)来暂存它们以进行删除。这可以防止操作系统尝试扩展通配符,而是 git 扩展它并暂存已删除的文件:`git add 'foo/*/deleted.file'`。 (3认同)
  • 对此有一个重要的警告:像 `git add foo/*/deleted.file` 这样的东西不起作用,因为 `*` 只扩展到仍然存在的文件。不过,您可以使用不依赖于现有文件的其他模式,例如“git add foo/{bar,baz,quux}/deleted.file” (2认同)

Gam*_*ing 7

您可以使用

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

暂存已删除的目录.


Ash*_*ngh 7

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

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

这是显而易见的,但值得一提的是,当您使用git add ..


use*_*284 6

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

git ls-files --deleted -z | xargs -r0 git rm
Run Code Online (Sandbox Code Playgroud)

作为 git 别名:

git config --global alias.rm-deleted '!git ls-files --deleted -z | xargs -r0 git rm'
Run Code Online (Sandbox Code Playgroud)

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

此语法也与鱼兼容。


ori*_*zil 5

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

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
Run Code Online (Sandbox Code Playgroud)