删除git filter-branch中的大量文件

时间:2013-08-01 12:01:52

标签: git git-filter-branch git-rewrite-history

我正在将存储库从svn迁移到git。

在最后一步中,我想从历史记录中删除大量不需要的文件。

我正在尝试以下命令:

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

但是它会经历过多次过滤分支,历史很长......所以,这需要花费太多时间。

有没有更快的方法来过滤分支删除大量文件?

1 个答案:

答案 0 :(得分:6)

我建议使用The BFG,这是git-filter-branch的一种更简单,更快捷的替代方案,专门用于从Git历史记录中删除不需要的文件。

你在your comment中提到问题文件通常是大二进制文件,并且BFG有一个特定的选项来处理这个 - 你应该仔细遵循BFG的usage instructions,但核心部分就是这个:

$ 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的作者。