6

我有一个(直到现在)使用 git 来存储其依赖项的代码库。存储库本身可在此处获得(警告:它非常庞大)。不用说,我需要从存储库历史记录中删除依赖项,以便将其缩减到合理的大小。

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

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

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

这些结果:

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

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

各种查找文件名的尝试都失败了。

git repack -a, git repack -ad, 和git repack -Ad所有似乎都没有效果。

4

4 回答 4

14

--prune=now在 git gc 上使用

尽管您已成功地将不需要的对象从历史记录中写入,但看起来这些不需要的对象并未被修剪,因为它们太年轻而无法默认修剪(有关更多详细信息,请参阅配置文档)。git gc使用git gc --prune=now应该处理这个问题,或者你可以看到这个答案以获得更多核选项。

尽管这应该可以解决您的最后一个问题,但一个潜在的问题是很难找到大斑点以便删除它们git filter-branch- 我会说:

...不要使用 git filter-branch

git filter-branch用于这样的任务是很痛苦的,并且有一个更好的,不太知名的工具,称为BFG专门用于从 Git 存储库中删除大文件。

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

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

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

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

$ git gc --prune=now --aggressive

BFG 通常比在大型 repo 上运行快数百倍,git-filter-branch并且这些选项是围绕以下两个常见用例量身定制的:

  • 删除疯狂的大文件
  • 删除密码、凭证和其他私人数据

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

于 2013-03-02T15:21:52.410 回答
4

你试过跑步git gc吗?http://www.kernel.org/pub/software/scm/git/docs/git-gc.html

于 2011-07-30T16:13:47.680 回答
3

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

然后,正如在进一步讨论中一样,使用原始存储库git initgit 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
于 2013-01-03T03:05:23.403 回答
1

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

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

于 2014-08-31T19:31:59.773 回答