git - 为什么 filter-branch 上的 --cached 选项会从工作目录中删除文件?

标签 git git-filter-branch

我需要从旧的存储库中删除一些本应被忽略的 Xcode 文件。所以我运行了以下命令

git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD

我的理解是添加 --cached 不会影响当前工作目录,但 git 也会删除那些匹配的文件。幸运的是我有一个备份(!),但我很好奇它为什么这样做,或者我误解了 --cached 的作用?

最佳答案

罪魁祸首不是 git rm 命令。它的 --cached 选项确实如您所说。您可以在小型 git 存储库中轻松尝试。

虽然手册页没有提到,git filter-branch 似乎并没有保留你的工作区。实际上,如果您的工作区域不干净,该命令将拒绝运行,这已经是一个迹象。

但是即使文件从工作区消失了,它们也没有从仓库中消失。它们只是不再在您当前分支中可访问的任何提交中。但是过滤器分支存储在重写为引用 namespace refs/original/之前引用了您的分支。

使用命令git show-ref查看。

您可以查看旧版本以访问您删除的文件。你可以使用命令 git cat-file blob refs/original/refs/heads/master:foo 无需 check out 即可获取文件内容(使用show-ref显示的引用,foo是想要的名字文件)。有很多可能性

您可以使用 gitk --all 浏览您重写的和当前的分支,您会发现没有任何东西真的消失了。

关于git - 为什么 filter-branch 上的 --cached 选项会从工作目录中删除文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6972115/

相关文章:

git - 在不同的 Git 分支中正确使用 GNU Global 标签文件

Git 克隆。 key_load_public : invalid format Permission denied (publickey)

git - 删除 git repo 中所有以前版本的文件

git - 将许多子目录拆分为一个新的、独立的 Git 存储库

git - 在工作树层次结构中向上移动 .git 文件夹

git - 如何将 GitHub 项目中的子目录创建为新存储库?

git - '致命的 : not a git repository (or any of the parent directories): . git'

git - TFS/ Visual Studio 2015 : how to compare file changes between 2 commits

git - 显示提交 A 处于打开状态且提交 B 未处于打开状态的所有分支?

Git 永久删除文件不会导致较小的存储库?