为什么我的Git存储库比Mercurial版本大得多?

sla*_*ery 13 git mercurial

我使用快速导出将Mercurial存储库转换为Git.但Git存储库非常庞大:Git为18 GB,Mercurial为3.4 GB.我的清理步骤都没有帮助.

我的Mercurial存储库由一个65 MB文件(SQLite格式的Anki抽认卡)主导,每天更新.它的历史已经增长到2.9 GB,低于.hg/store/data.

我希望Git能够更好地压缩历史记录,但我无法将存储库缩小到18 GB以下!

我试过git prune,git gc和其他人一样无济于事.我甚至尝试压缩.git文件夹,它仍然是18 GB.

我错过了什么吗?

更新:我尝试了Bazaar(bzr),它将我的存储库压缩到仅2.3 GB.太好了!

Omn*_*ous 9

一个原因可能是Mercurial具有非常紧凑的存储格式,即使对于二进制文件也会涉及差异.由于使用差异来重新创建版本可能非常耗时,因此只要差异+旧原始版本超过完整快照大小的两倍,它就会存储完整的快照.

就个人而言,我会尝试存储sqlite数据库的转储而不是数据库文件本身,并查看它的位置.它可能效率更高.

我不知道git的存储格式是什么.但我猜它不会像Mercurial那样涉及差异.

  • +1用于建议sqlite转储,而不是对db本身进行版本控制.Git(实际上也是Mercurial)主要用于*源*控制系统,而不是用于各种数据的版本控制系统.当然它可以处理你扔的任何东西; 它可能会占用大量的空间. (6认同)
  • Git也执行差异压缩,然后在包上传递zlib. (3认同)

man*_*lds 7

如果git gc失败,请尝试手动运行a git repack然后再运行git gc.


我对SVN,Git和Hg的观察:

我一直观察到SVN和Hg存储库比相应的git存储库小得多.这是因为每次更改文件(文本或二进制文件)都会为其添加新的完整对象.在SVN中,即使在二进制文件的情况下也只添加了差异,并且SVN中的二进制差异也非常好.

但这是包文件的来源,因为它们只存储类似对象中的diff(delta),甚至是压缩的.即使有打包,我观察到Git存储库,取决于文件的类型和这些文件所经历的更改量,往往更大.这是我接受Git接受的事情,考虑到Git的各种操作有多快,我愿意接受这种妥协.

  • 我在SVN和git之间的经历恰恰相反.在我比较的存储库中,git repo比SVN小3-5倍. (3认同)