git filter-branch --tree-filter不删除文件

时间:2017-12-20 07:58:17

标签: git git-filter-branch

我们的git存储库中有一个错误提交的文件。首先,我通过从How to find/identify large files/commits in Git history?

运行以下命令找到了导致此问题的文件
$ git rev-list --objects --all \
> | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
> | awk '/^blob/ {print substr($0,6)}' \
> | cut --complement --characters=13-40 \
| sort --numeric-sort --key=2 \
> | cut --complement --characters=13-40 \
> | numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

结果为6b82d8f18acd 716MiB MSSender/DebContainer.tar.tgz

然后,我使用https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#The-Nuclear-Option:-filter-branch中的git filter-branch --tree-filter "rm -f DebContainer.tar.tgz" HEAD --all命令删除所有分支中的此文件。处理它时会创建一个gitrewrite文件夹并以相同的大小创建.git文件夹吗?我可能做错了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

git filter-branch documentation中记录了重写历史记录后缩小存储库大小的过程。

某些引用仍可访问已删除的文件:

  • 引用由filter-branch
  • 创建的备份
  • reflog参考

因此,要缩小.git文件夹,您必须删除这些引用:

  • 通过从重写的
  • 创建新克隆
  • 通过删除引用并垃圾收集回购内容:

    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
    git -c gc.reflogExpire=now gc --prune=all
    

注意
任何修改过的引用都需要强制推送到原始存储库 任何克隆此存储库的人都需要仔细更新它的存储库(每个本地分支git pull --rebase应该是最佳选择)