用git filter-branch删除大量文件

9

我正在将一个代码库从svn迁移到git。

在这最后一步中,我想从历史记录中删除许多不必要的文件。

我尝试了以下命令:


```bash git filter-branch --tree-filter 'rm -rf path/to/unwanted/files' HEAD ```
git filter-branch --prune-empty --index-filter \
  "for file in $(cat files); do git rm -rf --cached --ignore-unmatch ${file}; done" -f

但是它说参数列表太长。

我可以这样重写:

for file in $(cat files); do
  git filter-branch --prune-empty --index-filter \
    "git rm -rf --cached --ignore-unmatch ${file}" -f
done

但是这样会运行filter-branch很多次,而且历史记录很长...所以,这需要太多时间。

有没有更快的方法来使用filter-branch删除大量文件?


你能否考虑在从 SVN 到 Git 的过程中拆分 Git 仓库?我基本上是在请求进行代码库重构。 - forvaidya
可能是重复的问题:新的仓库,只包含当前跟踪文件的复制历史记录 - user456814
我已经做了。但是仓库还是太大了。我的同事们过去常常将二进制文件提交到 SVN 中,例如 jBoss、JDK 和其他一些东西... 真是一团糟... - caarlos0
@caarlos0,你有没有看到那里关于如何使用filter-branch删除大量文件的答案?你试过吗?(有不止一种方法)。你尝试了哪些方法?你看到任何错误消息或其他指示说明它们为什么可能失败了吗? - user456814
我尝试了几种方法...都没有成功,出现了"文件未找到"和奇怪的语法错误...不管怎样...也许我只是等待我的for结束吧。 - caarlos0
问题可能是您使用双引号引用字符串时,字符串被过早地扩展了。您的文件名需要加引号吗? - jpmc26
1个回答

7
我建议使用The BFG,它是一个更简单、更快的替代方案,专门设计用于从Git历史记录中删除不需要的文件。您在您的评论中提到问题文件通常是大型二进制文件,而The BFG有一个特定的选项来处理这个问题-您应该仔细遵循BFG的使用说明,但核心部分只是这样:
$ java -jar bfg.jar  --strip-blobs-bigger-than 10M  my-repo.git

如果文件大小超过10MB(不在您的最新提交中),将从Git存储库的历史记录中删除。然后,您可以使用git gc清除死数据:

$ git gc --prune=now --aggressive

BFG通常比运行git-filter-branch快至少10-720x,并且通常更易于使用。

完全披露:我是BFG Repo-Cleaner的作者。


我最终等待着......但既然这是唯一的答案,我已将其标记为正确。谢谢。 - caarlos0
1
这对于大量非常小的文件毫无用处。另外,这里使用“--aggressive”选项是否明智?请参考《git gc --aggressive的困扰(以及git增量的工作原理)》(https://metalinguist.wordpress.com/2007/12/06/the-woes-of-git-gc-aggressive-and-how-git-deltas-work/)。 - jpmc26
我没有访问bfg的权限,所以最终我使用了GitHub方法,这个方法与原始问题几乎相同。 - Trevor Boyd Smith

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