Git - 为什么我的两个Git克隆之间的对象数量不同?

时间:2015-07-17 15:32:47

标签: git garbage-collection

我有两个从同一个遥控器克隆的本地存储库。我将对所有分支的所有更改都拉到了本地存储库,但是调用git gc时显示的对象数量(或git pull)不同...

这是否意味着两个存储库不同步?

'in-pack'对象的数量由git count-objects -v显示:

count: 0
size: 0
in-pack: <THIS NUMBER HERE>
packs: 1
size-pack: <a size>
prune-packable: 0
garbage: 0
size-garbage: 0

git gc

Counting objects: <HERE>, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (yyyy/yyyy), done.
Writing objects: 100% (<HERE>/<HERE>), done.
Total <HERE> (delta xxxx), reused <HERE> (delta zzzz)

我的两个本地存储库的对象数量是否应该相同?(因为它们都是最新的?)

1 个答案:

答案 0 :(得分:2)

首先,您应该通过在每个存储库中运行git for-each-ref(或类似)来检查您拥有的引用。某些引用(包括stash中的引用)将保留可能仅出现在一个存储库中的对象。

除此之外,还有一个活跃的&#34; git存储库(通过&#34;有效&#34;我指的是您编辑的git addgit commit以及偶尔git rebasegit resetgit stash ,等等)累积一个数字 - 可能是一个非常大数量的&#34;已删除,但尚未过期&#34;提交。 (它也会累积已删除和过期的提交,但您在上面提到了git gc,并且实际上删除了这些提交,因此它们不再对对象计数做出贡献。)

如果你过期所有reflogs并修剪所有东西(注意,这是移除你所有的安全带和安全带,抛弃你的高线平衡杆,抛弃所有救生艇,并打开外部气闸 1 ...即,不要随心所欲地这样做:

git reflog expire --expire=now --expire-unreachable=now --all
git prune --expire=now

然后运行git gc,您应该获得最少数量的对象。 (如果两个存储库都处于活动状态,则可能必须在两者上执行此操作。)

1 显然,你是在一条高空的电线上做这件事的,这条电线是在一艘在太空栖息地内的海洋上航行的船上驾驶的。哇。 : - )