使用BFG后,Git存储库只会变得更大

4
我们目前正在将我们的SVN仓库迁移到托管在Bitbucket上的GIT中。 我使用subgit将所有分支/历史记录导入本地电脑(Windows)上的裸仓库。 该仓库很大(导入后为7.42 GB),因为它还包含有关SVN的信息,如版本号,以提供Git和SVN之间的双向同步方式(我只对单向SVN到GIT感兴趣)。 我创建了一个导入裸仓库的本地克隆,并将所有分支推送到bitbucket。 几个小时后,仓库被完全上传。 BitBucket现在给了我有关仓库大小的警告。 我检查了大小,只有1.1GB。这不如裸仓库那么大,但对于快速仓库来说还是太大了。 经过使用BFG的试验,我成功地删除了一些大型DLL / SQL导出文件,并使用以下命令在裸仓库中实现了此操作(我只使用克隆来进行推送,而没有所有与svn相关的引用)。
java -jar bfg.jar --delete-files '{''specialized 2015''','''specialized,''insert-pcreeks''}.sql' --no-blob-protection

java -jar bfg.jar --delete-files 'Incara.*.dll' --no-blob-protection Incara.git

git reflog expire --expire=now --all && git gc --prune=now --aggressive

这个过程花了一些时间,之后git_find_big.sh脚本不再显示这些大型SQL文件。但是在将事情推回到bitbucket(作为新的repo,而不是强制推送)之后,它变得更大了(1.8GB)。
你能提供一个可能的解释吗?
我不知道这是否重要,但我们在svn中使用了非标准的分支/标记模型。这导致像/refs/heads/archive/some/path/to/branch这样的分支似乎工作得很好,删除它们也不会影响大小。
除了这些问题,我注意到在git_find_big.sh输出中出现了一些XML文件:
size,pack,SHA,location 12180,1011,56731c772febd7db11de5a66674fe6a1a9ec00a7 repository/frontend.xml 12074,1002,0cefaee608c06621adfa4a9120ed7ef651076c33 repository/frontend.xml 12073,1002,a1c36cf49ec736a7fc069dcc834b784ada4b6a06 repository/frontend.xml 12073,1002,1ba5bd92817347739d3fba375fc42641016a5c1d repository/frontend.xml 12073,1002,e9182762bfc5849bc6645fdd6358265c3930779f repository/frontend.xml 12073,1002,dff5733d67cb0306534ac41a4c55b3bbaa436a2e repository/frontend.xml 12072,1002,8ee628f645ce53d970c3cf9fdae8d2697224e64c repository/frontend.xml 12072,1002,1266dee72b33f7a05ca67488c485ea8afc323615 repository/frontend.xml

这些文件包含我们使用的Web平台的前端逻辑,确实相当大。 但是它们应该被视为文本,对吗?因此,我不明白为什么它们在上面的输出中显示为单独的对象。我对吗,这种情况不应该发生?

SVN导入还导致了一些空提交(例如,当SVN创建或移动分支时,它需要一个新的提交)。我想这些只能使用filter-branch来删除?

抱歉,我有很多问题! 有人能帮我解决这个问题吗?

谢谢,

Piet


在执行 git gc 步骤后,清理后的本地仓库大小是多少?特别是 objects/pack 文件夹的大小是多少?此外,一个新的本地 BitBucket 仓库克隆的大小是多少? - Roberto Tyley
你是否设置了.gitignore来忽略与SVN相关的文件?也许git和svn会保存彼此的文件? - Nick Volynkin
@NickVolynkin:我没有改变.gitignore文件。但是subgit创建了它并引用了一些SVN已经忽略的文件。但是我在git仓库中没有看到任何svn特定的文件。 - Piet
@RobertoTyley: 克隆后GC:2.15 GB(打包文件夹) 从Bitbucket克隆:1.33 GB(对象文件夹) - Piet
2个回答

2
我已经在您的问题评论中要求了一些更多的诊断信息,这些信息是回答主要问题所需的,但是对于您的次要问题(Stackoverflow鼓励您单独提问!),以下是一些指针:
在git_find_big.sh的输出中,我注意到有一些XML文件: [snip] 这些文件包含我们正在使用的Web平台的前端逻辑,确实很大。但它们应该被视为文本,对吧?因此,我不明白为什么它们会显示为上面输出中的单独对象。我对吗,这种情况不应该发生?
Git根据文件内容(SHA哈希)分配ID,就此而言,它不关心您的文件是否为文本 - 如果文件稍有不同,则它们的ID也不同,并将被单独存储(Git可能在幕后执行增量压缩,但这并不能阻止文件被定义为逻辑上分离)。因此,同一文件的不同版本出现在git_find_big.sh输出中多次并不奇怪。
SVN导入还导致了一些空提交(例如,当SVN创建或移动分支时需要新提交)。我想这些只能使用filter-branch删除?
是的,BFG默认不会执行此操作。但是,这是filter-branch可以相对快速地完成的任务之一(即使使用起来有点棘手)。

1

在运行BFG后,我的包大小增加问题再次出现,最终是由于git版本2.18时期的版本包问题引起的。使用2.19的同事没有这个问题,我能够在2.19中找到修复bug的描述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接