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

mar*_*ker 6 git git-filter-branch

我需要从一个应该被忽略的旧仓库中删除一些Xcode文件.所以我运行了以下命令

git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD
Run Code Online (Sandbox Code Playgroud)

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

Uwe*_*der 5

罪魁祸首不是git rm命令。它的--cached选项确实如您所说。你可以在一个小的 git repo 中轻松地尝试。

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

但即使文件从工作区消失,它们也不会从回购中消失。它们只是不再在您当前分支中可访问的任何提交中。但是过滤分支存储在重写以引用名称空间 refs/original/ 之前引用您的分支。

使用命令git show-ref查看。

您可以查看旧版本以访问已删除的文件。您可以使用 command git cat-file blob refs/original/refs/heads/master:foo无需签出即可获取文件的内容(使用 show-ref 显示的引用,foo 是所需文件的名称)。有很多可能性

您可以使用gitk --all来浏览您重写的分支和当前的分支,您会看到什么都没有真正消失。