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

Git - why does the number of objects differ between my two Git clones?

我有两个从同一个远程克隆的本地存储库。我为所有分支 提取了对两个本地存储库的所有更改,但是调用 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)

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

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

除此之外,还有一个 "active" git 存储库("active" 我的意思是您可以在其中编辑 git addgit commit 偶尔 git rebasegit resetgit stash 等等)累积了一个数量——可能是一个非常大的数量——"deleted, but not yet expired" 次提交。 (它也会累积已删除和过期的提交,但是您在上面提到了 git gc,并且实际上删除了这些,因此它们不再对对象计数有贡献。)

如果你过期了所有的 reflogs 并且 p运行e 一切(注意,这是移除你所有的安全带和安全带,把你的高线平衡杆扔到一边,抛弃所有的救生艇,并打开外气闸1 ...即,不要一时兴起这样做):

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

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


1显然,您是在连接在汽车上的高架钢丝上执行此操作,该汽车在 space 栖息地的海洋上航行的船上行驶。哇。 :-)