Bitbucket警告说我的git回购太大,但我无法确认大文件

Bitbucket警告说我的git回购太大,但我无法确认大文件,git,version-control,bitbucket,bfg-repo-cleaner,Git,Version Control,Bitbucket,Bfg Repo Cleaner,Bitbucket警告说我的Git存储库超过了1GB。实际上,在存储库详细信息页面中,它说它是1.7GB。那太疯狂了。我必须在版本控制中包含大数据文件。我的本地存储库实际上是10GB,这意味着至少我在某种程度上成功地使用了.gitignore,将大文件从版本控制中排除 接下来,我按照这里的教程尝试删除未使用的大数据。命令files.git count objects-v位于my repo的顶级文件夹中 返回以下内容: count: 5149 size: 1339824 in-pack: 1135

Bitbucket警告说我的Git存储库超过了1GB。实际上,在存储库详细信息页面中,它说它是1.7GB。那太疯狂了。我必须在版本控制中包含大数据文件。我的本地存储库实际上是10GB,这意味着至少我在某种程度上成功地使用了
.gitignore
,将大文件从版本控制中排除

接下来,我按照这里的教程尝试删除未使用的大数据。命令
files.git count objects-v
位于my repo的顶级文件夹中 返回以下内容:

count: 5149
size: 1339824
in-pack: 11352
packs: 2
size-pack: 183607
prune-packable: 0
garbage: 0
size-garbage: 0
大小为183607KB的压缩包比1.7GB小得多。我有点困惑

接下来,我下载了BFG Repo Cleaner,并运行命令
java-jar BFG-1.12.3.jar——在顶层目录中剥离大于100M的blob
,从所有非最新提交中删除大于100MB的文件。但是,BFG返回了以下消息:

Warning : no large blobs matching criteria found in packfiles 
- does the repo need to be packed?
在50米的时间内重复相同的操作,结果相同

这是否意味着所有大于50MB的文件都在最新提交中?在Bitbucket的源代码浏览器中,我查看了包含大数据文件但未包含这些文件的文件夹(已成功忽略)


有人能简要解释一下,关于存储库大小和repo中是否存在大型文件的混淆源是什么吗?

此时,您需要查看服务器上的存储库,以确定问题所在,并且您可能需要与BitBucket技术支持人员交谈。但您的描述听起来好像您的存储库中有一些可以清理的垃圾

考虑一下,您是否已将大约500 MB的文件推送到BitBucket存储库中。现在您意识到了错误,并以某种方式(例如BFG)将其从存储库中删除,然后推送更新后的ref。远程设备上的ref将更新为指向新提交,并且存储库将不会显示包含大文件(如果克隆存储库,则不会获得大文件)

但是远程服务器不会删除旧提交或该提交中的旧文件。它只会断开它与图形的连接,而那个大文件将不再“可访问”。事实上,它是符合“垃圾收集”条件的“垃圾”。这将删除大文件,服务器上的存储库大小将缩小

没有办法要求服务器使用GC(通过git协议)。BitBucket的支持应该能够为您执行以下操作:

你需要找我们来触发gc。我想最好的办法是在紧急情况下“升级”,我们应该能够立即处理。-比特桶支架(2016年12月)


注意,这假设您实际上在本地拥有完整的存储库,请确保执行
fetch--all
,以确保您在本地没有(可访问的)历史的子集。如果是BFG,请确保您已使用
--mirror
选项克隆了存储库。

我们认为我们今天遇到了相同的问题,并且能够在不联系Bitbucket支持人员的情况下解决它,如下所示。请注意,该方法将丢弃来自repo的最后一次提交——因此您可能希望备份它

Bitbucket报告说,我们的回购协议约为2.1GB,而克隆时,本地仅需约250MB。从这一点上,我们得出结论,它最有可能来自无法访问的提交中的大文件(感谢Edward上面的回答)

这是如何在本地看到不可访问的提交,其中我们不考虑通过reflog的可访问性:

git fsck--不可访问--无反射

在本地,无法访问的提交可以通过以下方式清理:

git reflog expire --expire-unreachable="now" --all
git prune --expire="now" -v
git gc --aggressive --prune="now"
但是,我们无法在Bitbucket上远程运行任何这些命令。但是,他们在(删除存储库限制部分)上说,他们自己运行
git gc
,以响应执行
git reset--hard HEAD~1
(它丢弃最后一次提交),然后执行
git push-f
。此外,他们在垃圾收集死数据一节中说,可以尝试以下顺序:
git reflog expire--expire=now--all
git gc--prune=now
git push--all--force
。考虑到所有这些,我决定在本地尝试以下操作,希望它能够切断reflog并在本地进行修剪,然后将它们推送到远程Bitbucket存储库,并在其中启动gc:

git reflog expire --expire-unreachable="30m" --all
git prune --expire="30m" -v
git gc --prune="30m"
git reset --hard HEAD~1
git push -f
这样做奏效了,回购规模立即从2.1GB增加到约250MB

请注意,time参数to expire/expire unreachable/prune设置了从现在开始测量的过期截止点。例如,“now”表示过期/删减所有内容,“30m”表示除过去30分钟内的更改外的其他内容


编辑:

关于反射,我想到的一件事是,由于git在默认情况下会在30天后过期不可访问的reflog条目,因此我的命令序列可能没有工作,因为我在本地运行了
git reflog expire
git prune
git gc
(可能没有被推到远程repo),但是因为由git reset触发的远程git gc删除了所有超过30天的不可访问的提交

因此,可能以下情况对我也有同样的影响:

git reset --hard HEAD~1
git push -f

对于过去30天内所做的无法实现的更改,我仍然需要联系Bitbucket支持部门。

我尝试了Jan的答案,但在我的案例中,
git reset——硬头~1
然后是
git push-f
没有触发
git gc

最后,我把我的问题发布在上,Atlassian person为我运行了
git gc
,问题就解决了。
他们的答复没有晚(~3小时),所以我建议这样做。

谢谢。所以,基本上这是不正常的,m