9

我正在将存储库从 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

但它会运行 filter-branch 很多次,而且历史很长.. 所以,它会花费太多时间。

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

4

1 回答 1

7

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

您在评论中提到问题文件通常是大二进制文件,而 BFG 有一个特定的选项来处理这个问题 - 您应该仔细遵循 BFG 的使用说明,但核心部分是这样的:

$ java -jar bfg.jar  --strip-blobs-bigger-than 10M  my-repo.git

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

$ git gc --prune=now --aggressive

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

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

于 2013-08-01T12:38:09.107 回答