2011-08-06 38 views
13

我已经转换一个Mercurial库到Git的,使用快速出口。但Git仓库非常庞大:Git为18 GB,Mercurial为3.4 GB。我的清理步骤都没有帮助。为什么我的Git仓库比Mercurial版本大得多?

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

我希望Git能够压缩历史更好一点,但我一直无法缩小18 GB以下的存储库!

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

我错过了什么吗?

更新:我试过Bazaar(bzr),它压缩了我的存储库只有2.3 GB。太好了!

+0

我不知道为什么这是被拒绝... – Omnifarious

+1

你尝试过'git gc --aggressive'吗? – cdhowie

+0

我确实尝试过'git gc --aggressive',但它在一段时间后因内存错误而死亡。但到那时,它创建的临时包文件已经超过了5GB ......它看起来没有我以前运行过的'git gc'好看多了。 – slattery

回答

7

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


我与SVN,Git和Hg的意见:

我一直认为,SVN和Hg库比相应的Git仓库小得多。这是因为每个文件或二进制文件的更改都会为其添加一个新的完整对象。在SVN中,即使在二进制文件中也只添加diff,并且SVN中的二进制差异也非常好。

但是,这是包文件进来,因为他们只存储差异(增量)之间相似的对象和甚至压缩。即使在打包的情况下,我也观察到Git存储库取决于文件的种类以及这些文件所经历的更改量,因此存在较大的差异。这是我用Git接受的东西,这是我愿意接受的折衷,因为Git的各种操作有多快。

+3

我在SVN和git之间的经验恰恰相反。在我比较的仓库中,git仓库比SVN仓库小3-5倍。 –

+1

@ Ryan Stewart - 就像我说的,它将取决于文件的种类和更改的数量。在Git中变化的中大型二进制文件的回购通常会比SVN中的大,即使在打包时也是如此。 – manojlds

+0

感谢@manojlds ..看到Git占用了更多的空间令人失望,但我想我必须接受它。我现在将保存在Mercurial中。也许在将来,Git将能够像Mercurial一样高效地存储这个存储库。 – slattery

9

的一个原因可能是水银具有涉及的diff,即使是二进制一个非常紧凑的存储格式。而且,由于使用的diff重新制作的版本可能是非常耗时的,它会尽快的diff +老原超过一个完整的快照大小的双存储一个完整的快照。

就我个人而言,我会尝试存储您的sqlite数据库的转储,而不是数据库文件本身,并查看得到你的位置。这可能会更有效率。

我不知道是什么混帐的存储格式。但我猜测它并不像Mercurial那样涉及差异。

+3

Git也执行差分压缩,然后在包中传递zlib。 – cdhowie

+0

感谢您的信息。我只是很失望,我一直无法轻松地将这个存储库切换到Git。 – slattery

+6

+1用于建议一个sqlite转储,而不是版本化数据库本身。 Git(实际上也是Mercurial)主要是为了* source *控制系统,而不是针对各种数据的版本控制系统。当然,它当然可以处理任何你投掷的东西;它可能会占用大量的空间。 – MatrixFrog

0

从Mercurial迁移的存储库上运行git gc --aggressive为我工作。它从500 MB减少到150 MB。

相关问题