git filter-branch --tree-filter导致“未知的修订版本或路径不在工作树中”。

5

我的git仓库很大,我想通过删除一些过去添加但已经删除的大文件来减小它的大小,但这些文件仍然存在于git历史记录中。现在我发现了git filter-branch --tree-filter命令。所以我尝试了以下操作:

git filter-branch --tree-filter 'DEL /content/de/files/bigfile.zip' --all

我使用的是 Windows 操作系统。

但调用此命令的结果为:

fatal: ambiguous argument '/content/de/files/bigfile.zip'': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

我不知道该怎么办。在当前的工作目录下,该文件确实不存在。但是它仍然存在于历史记录中的几个旧提交中。我的理解是,该命令将从每个提交中删除该文件。


3
这种方法作为索引过滤器要快得多,因为您不需要触及内容,所以无需加载工作树。git filter-branch --index-filter 'git update-index --force-remove content/de/files/bigfile.zip' -- --all - jthill
谢谢,我会尝试的。关于您的第一条评论:我也尝试过不加前导 /,但没有任何区别。 - ghost23
嗯,我按照你上面的方式尝试了一下,然后它显示:致命错误:错误修订版本“update-index”。 - ghost23
我想你正在使用Windows shell,是吗?尝试使用Unix shell,绝大多数了解Git的人都专门使用它。 Unix工具箱中有太多无与伦比的工具,没有理由重新实现它们。 - jthill
好的,最后一个问题。在调用命令之后,我如何推送到远程仓库?需要使用强制推送吗?因为当进行简单推送时,它现在显示我落后于远程仓库的对应版本。 - ghost23
显示剩余3条评论
2个回答

9

所以我版本中的实际错误是,我使用了单引号而不是双引号。看起来,在Windows上,你必须使用双引号。

话虽如此,jthill的评论和Roberto的答案可能提供了更好的解决方案。


1
致命错误:无效的修订版本“checkout”,加上双引号即可解决! - Timar Ivo Batis
在Windows上,git filter-branch 委托给在MinGW Bash下运行的 git/mingw64/libexec/git-core/git-filter-branch,因此从命令提示符中运行 git 将启动Bash,然后Bash将在Bash下启动传递给 --filter-xxx 的命令。由于这是在MinGW中,所以该命令可以是批处理文件。转义规则很奇怪,我们可以在双引号内使用MinGW Bash语法(正确转义为命令提示符),因此 --msg-filter 可以正确地看到参数。请注意,在 --filter-xxx 参数内部不能使用 \,因为它将通过 eval "$xxx" 执行,需要使用 \\ 代替。 - TWiStErRob

1
你可能想考虑使用BFG,这是一个比git filter-branch更快更简单的替代方案。相应的命令是: $ bfg --delete-files bigfile.zip

https://rtyley.github.io/bfg-repo-cleaner/

免责声明:我是BFG的作者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接