我有一个存储在文件系统上的存储库,我需要将其迁移到HTTPS git存储库。问题是迁移后的repo比原来的要小,准确地说是179M vs 545mb。
原始的repo是这样的:
$ tree -L 2 .git
.git/
├── branches
├── config
├── FETCH_HEAD
├── HEAD
├── hooks
├── index
├── logs
│ └── refs
├── objects
│ ├── incoming_1638816568970138516.pack
│ ├── incoming_2231423675192085195.pack
│ ├── incoming_252567842603709439.pack
│ ├── incoming_2956015230264054740.pack
│ ├── incoming_3048626775278812485.pack
│ ├── incoming_3322152774343971530.pack
│ ├── incoming_3707332777993276763.pack
│ ├── incoming_407171399829023385.pack
│ ├── incoming_4072000993266381297.pack
│ ├── incoming_4293432441900999175.pack
│ ├── incoming_4833572675284287989.pack
│ ├── incoming_4943537936436869872.pack
│ ├── incoming_5555086829860720971.pack
│ ├── incoming_5912835395946639495.pack
│ ├── incoming_7273182803237175093.pack
│ ├── incoming_7510898138918506599.pack
│ ├── incoming_7865231230366160752.pack
│ ├── incoming_8724975206375007218.pack
│ ├── incoming_8787762604831244623.pack
│ ├── incoming_9046531469688239004.pack
│ ├── info
│ └── pack
└── refs
├── heads
├── remotes
└── tags
$ git branch -a
cli
max
codefactoring
* master
new-load-configuration
new-loader
plugins_dev
remotes/origin/cli
remotes/origin/max
remotes/origin/codefactoring
remotes/origin/master
$ du -sh .
545M .
这是我所遵循的迁移过程:
$ mkdir temp_dir && cd temp_dir
$ git clone --mirror /path/to/original/repo
$ cd /path/to/original/repo
$ git remote add new-origin https://myuser@my.source.server/myuser/repo.git
$ git push new-origin --mirror
然后,如果我看一下最终的repo大小,它是179MB。
你知道这里发生了什么吗?
谢谢。
存储在克隆存储库中的信息在克隆实际开始之前被打包。这样,它被完美地压缩并保持较小的大小,同时包含原始存储库的所有信息。
然而,原始存储库可能随着时间的推移而发展,因此它可能是碎片化的,不能有效地打包。也许它根本没有被完全打包,但包含了尚未优化的对象,甚至是不再可访问的对象。您可以尝试在原始存储库上使用git gc
(或其更激进的选项之一),看看是否可以进一步缩小它。
我认为差异在于您的原始存储库是非裸存储库,而迁移的存储库是裸存储库。因此,545MB包含了工作树的大小,这在迁移的repo中是缺失的。将所有大小差异(545MB - 179MB = 366MB)归因于工作树可能是合理的,原因如下:
-
存储库中的对象被压缩,而在工作树中它们没有被压缩。因此,在具有足够短的历史和/或强可压缩内容的存储库中,工作树可以明显超过
.git
的内容。 -
工作树可能包含未跟踪文件(例如构建工件)。