如何添加和提交使用“rm”而不是“git rm”进行的删除?

Posted

技术标签:

【中文标题】如何添加和提交使用“rm”而不是“git rm”进行的删除?【英文标题】:How to add and commit removals made with "rm" instead of "git rm"? 【发布时间】:2010-12-23 19:42:23 【问题描述】:

我使用 rm、Finder 等从 Git 存储库中删除了一堆文件和目录。

我正在寻找一个 Git 命令,它将这些记录到标记为删除的索引中,就好像我在它们上调用了git rm

我知道git add -u 会这样做,以及其他一些事情。我希望我的命令专门处理删除。

【问题讨论】:

相关但不完全重复:Removing multiple files from a Git repo that have already been deleted from disk。另一个问题已经表明git rm 可以暂存已删除的文件,它只是在寻找一种方法来暂存所有文件,只需一次调用git rm Removing multiple files from a Git repo that have already been deleted from disk的可能重复 【参考方案1】:

文件名中没有空格:

$ git rm `git ls-files -d`

更健壮:

$ git ls-files -z -d | xargs -0 --no-run-if-empty git rm

【讨论】:

请注意,它需要从您的 repo 的***目录运行。【参考方案2】:

在 Git 2.0 中,git add 的行为类似于 git add --ignore-removal <pathspec>,它会忽略您从工作树中删除的路径。

您可以使用git add --all <pathspec> 记录删除情况。

运行 git status 以检查您从工作树中删除的路径。

【讨论】:

【参考方案3】:

此命令将为您提供所有已删除文件的列表,这些文件将被转发到 git rm。所以所有文件都将被删除。如果没有找到已删除的文件,则不会发生任何事情:

git ls-files -z -d | xargs -0 --no-run-if-empty git rm

【讨论】:

【参考方案4】:

看看 Jonio C Hamano 在 git 邮件列表的“Re: [PATCH 1/2] Documentation: 'git add -A' can remove files”帖子中写了什么,即这个问题看起来像XY problem(你问的是问题的假设解决方案 Y,而不是问题 X 本身)。问题的解决方案(如果真的是“XY 问题”情况)可能是:

git commit -a,它会自动拾取删除,提交工作目录中跟踪文件的当前状态

git add -A,这将添加未被忽略的未跟踪文件并删除不再存在的文件,例如如果您想从工作目录的横向更新创建提交,例如解压缩 rsync 的快照或结果。

尽管如此,如果您问的是问题(而不是解决方案),那么正如您从其他答案中看到的那样,有工具可以解决。

【讨论】:

这直接回答了这个问题:git commit -a【参考方案5】:

Charles Bailey 的回答促使我这样做,但我仍然欢迎更简短的内容。

$ git diff --name-only --diff-filter=D | xargs git rm

【讨论】:

以上是关于如何添加和提交使用“rm”而不是“git rm”进行的删除?的主要内容,如果未能解决你的问题,请参考以下文章

GitGit 版本管理 ( 补充提交版本 git commit --amend | 版本库提取文件 git checkout -- filename | 删除文件 git rm )

git rm 和rm 的区别

如何在不从磁盘中删除文件的情况下 git rm 文件? [复制]

git rm 删除了文件 怎么恢复到上一个版本

git rm 删除了文件 怎么恢复到上一个版本

git rm -r --cached解决已提交的文件在.gitignore中加入忽略后无效的问题。