我需要从旧的存储库中删除一些本应被忽略的 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/