我有一个代码库(到现在为止)使用git来存储它的依赖项。存储库本身is available here(警告:它是巨大的)。不用说,我需要从存储库历史记录中删除依赖项,以便将其减少到合理的大小。
我首先使用David Underhill's instructions从历史记录中删除lib
目录。然而,即使在这样做之后,存储库仍然超过300M。发布git prune
和git 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 -a
,git repack -ad
和git repack -Ad
似乎都没有效果。
答案 0 :(得分:13)
--prune=now
虽然您已成功地将不需要的对象从历史记录中删除,但看起来这些不需要的对象没有被修剪,因为它们太年轻默认情况下被修剪(请参阅{{3}在git gc
上获取更多细节)。使用git gc --prune=now
应该可以处理,或者你可以看到configuration docs更多核选项。
虽然这应该可以解决你的最终问题,但是一个潜在的问题是找到大blob的难度,以便使用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