从存储库历史记录中删除大文件后,Git repo仍然很大

时间:2011-07-30 16:04:53

标签: git git-rewrite-history

我有一个代码库(到现在为止)使用git来存储它的依赖项。存储库本身is available here(警告:它是巨大的)。不用说,我需要从存储库历史记录中删除依赖项,以便将其减少到合理的大小。

我首先使用David Underhill's instructions从历史记录中删除lib目录。然而,即使在这样做之后,存储库仍然超过300M。发布git prunegit repack有所帮助,但仍然超过180M。

为了找到任何臃肿的斑点,我发了

git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head

这些结果:

  

105526b5d3d398b9989d88c2f9fc2d1dc96a85b8 blob 35685609 33600527 31978828   d296935e6ac5f3f58b50c789394c9769116e9c34 blob 35658016 33593241 112485744   50636f931180a32764edadd854968a971a083f8a blob 28360290 25897864 233390   b9e4dd37428e879a258f297b7f5bcfb9ba869695 blob 13108002 11640713 66661788   08d2720b2414aa07ce419b17d5f80c333c7313b7 blob 12551621 11124009 89231035   6197a478a461275a0396f20c28487e9ae619a5f9 blob 11975135 11058259 148211988 1 50636f931180a32764edadd854968a971a083f8a   549eb0c73776fd0ede27a2fcb03366f76f45a13c blob 9136086 8166649 166451273   5bc0a0f04a7004bc16cfab1c091c6b369fb74049 blob 9072616 8270262 80951514   741480238a6a6ce612cf089245dd46d6890fba9f blob 8858569 8080252 101294029   744226651c55b14c1aa8affb78fba4fdf02b577c blob 7412220 6766404 186825167

这就是我被困住的地方。我可以git show这些blob看到它们看起来非常像jar文件,但我无法弄清楚它们为什么还在回购中。

find their filenames的各种尝试都失败了。

git repack -agit repack -adgit repack -Ad似乎都没有效果。

4 个答案:

答案 0 :(得分:13)

在git gc上使用--prune=now

虽然您已成功地将不需要的对象从历史记录中删除,但看起来这些不需要的对象没有被修剪,因为它们太年轻默认情况下被修剪(请参阅{{3}在git gc上获取更多细节)。使用git gc --prune=now应该可以处理,或者你可以看到configuration docs更多核选项。

虽然这应该可以解决你的最终问题,但是一个潜在的问题是找到大blob的难度,以便使用git filter-branch删除它们 - 我会说:

...不要使用git filter-branch

git filter-branch很难用于这样的任务,并且有一个更好的,知名度较低的工具名为this answer专门用于删除 来自Git repos的大文件

删除大文件的核心命令如下所示:

$ bfg  --strip-blobs-bigger-than 10MB  my-repo.git

任何超过10MB的blob(不在最新的提交中)都将从存储库的历史记录中完全删除 - 您不必手动查找您自己的文件和受保护的提交中的文件是The BFG

然后,您可以使用git gc清除死亡数据:

$ git gc --prune=now --aggressive

BFG通常是safe,而不是在大型仓库上运行git-filter-branch,并且选项是围绕这两个常见用例量身定制的:

  • 删除疯狂大文件
  • 删除密码,凭据&其他私人数据

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

答案 1 :(得分:4)

答案 2 :(得分:3)

您需要在存储库中的每个分支上运行David Underhill's脚本,以确保从所有分支中删除引用。

然后,如在进一步的讨论中,使用git init和原始git pull中的git remote add origin <original>初始化新的存储库,然后拉出所有分支。

$ du -sh ./BIG
299M ./BIG
$ cd BIG
$ git checkout master
$ git-remove-history REMOVE_ME
....
$ git checkout branch2
$ git-remove-history REMOVE_ME
...
$ cd ../SMALL
$ git init
$ git remote add origin ../BIG
$ git fetch --all
$ git checkout master
$ cd ..
$ du -sh ./SMALL ./BIG
26M ./SMALL
244M ./BIG

答案 3 :(得分:1)

我不小心在git中存储了我网站的大.jpa个备份 -

git filter-branch --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch MY_BIG_DIRECTORY_OR_FILE' --tag-name-filter cat -- --all

使用相关文件夹重新标记MY_BIG_DIRECTORY_OR_FILE以完全重写您的历史记录,包括标记。

来源:

  

http://naleid.com/blog/2012/01/17/finding-and-purging-big-files-from-git-history

相关问题