当我跑步时:
git verify-pack -v .git\objects\pack\pack-*.idx
输出中的一行包含:
651302358b781ab60f364416272e1c35107c974f blob 23980089 23987383 699599322
但是如果我尝试用:
查找那个blobgit rev-list --all --objects | grep 651302358b781ab60f364416272e1c35107c974f
或:
git rev-list --all --reflog --objects | grep 651302358b781ab60f364416272e1c35107c974f
我得到一个空的结果。我是否应该无法查找verify-pack
返回的任何blob?
根据以下内容,我尝试:创建一个新的克隆,运行git repack
运行git gc
但结果相同。
答案 0 :(得分:2)
对象可能被放弃,即它的最后一个引用,无论它们是什么,现在都已经消失了。但是,由于对象位于包文件中,因此无法简单地将其删除。 Git必须构建一个全新的包。
如果使用git repack
构建新的包文件,则新包中将省略任何未引用的对象。 (请注意,git gc
会自动执行此操作。但是,.keep
文件可能会保留旧包,如果您已创建.keep
个文件。)
修改:作为jthill points out in a comment,您必须使用-a
或-A
重新打包以合并旧包。虽然自动git gc
在某些情况下会提供-A
,但它是only when the number of pack files exceeds gc.autoPackLimit
,defaults to 50。
答案 1 :(得分:0)
我发现这是在git帮助存储的底部,找到未引用的提交。
git fsck --unreachable |
grep commit | cut -d\ -f3 |
xargs git log --merges --no-walk --grep=WIP
答案 2 :(得分:0)
首先,我会检查该引用是否仍在该 idx 文件中
git gc
git repack -Ad # kills in-pack garbage
git prune # kills loose garbage
考虑使用 Git 2.32(2021 年第二季度):
git repack
is much faster nowgit rev-list
自 2016 年以来有了新的选择参见 commit 14e7b83(2021 年 3 月 19 日)、commit 2a15964、commit 13d746a、commit dab3247、commit f25e33c(2021 年 3 月 5 日)和 commit 0fabafd 、commit 339bce2、commit c9fff00、commit f62312e(2021 年 2 月 22 日)由 Taylor Blau (ttaylorr
)。
请参阅 commit ccae01c 的 Junio C Hamano (gitster
)(2021 年 3 月 5 日)。
请参阅 commit 20b031f 的 commit 6325da1、commit fbf20ae、commit 60bb5f2、Jeff King (peff
)(2021 年 2 月 22 日)。
(由 Junio C Hamano -- gitster
-- 于 commit 2744383 合并,2021 年 3 月 24 日)
revision
:学习“--no-kept-objects”签字人:Taylor Blau
审核人:Jeff King
未来的调用者希望能够执行可达性遍历,该遍历在访问保留包中找到的对象时终止。
最接近的现有选项是“--honor-pack-keep
”,但这不是我们想要的。
不是在中途停止遍历,而是始终执行完全遍历,并且结果仅在后记中被修剪。
除了需要引入一个新标志(因为事后剔除结果可能与在遍历发生时停止遍历不同),还有一个额外的问题来处理内核和磁盘保存包的区别。
即:什么样的保持包应该停止遍历?
引入 '--no-kept-objects[=<on-disk|in-core>]
' 以指定哪种保留的包(如果有)应停止遍历。
这对于想要执行可达性分析但想要单独留下某些包的调用者很有用(例如,当进行几何重新打包时,它有一些保留在核心中的“大”包,它想单独留下) .
注意:这只是一个“内部使用”选项,但很有趣,可以根据您的情况进行实验。