Git rev-list找不到提交

时间:2016-06-09 20:30:30

标签: git

当我跑步时:

git verify-pack -v .git\objects\pack\pack-*.idx

输出中的一行包含:

651302358b781ab60f364416272e1c35107c974f blob   23980089 23987383 699599322

但是如果我尝试用:

查找那个blob
git rev-list --all --objects | grep 651302358b781ab60f364416272e1c35107c974f

或:

 git rev-list --all --reflog --objects | grep 651302358b781ab60f364416272e1c35107c974f

我得到一个空的结果。我是否应该无法查找verify-pack返回的任何blob?

根据以下内容,我尝试:创建一个新的克隆,运行git repack运行git gc但结果相同。

3 个答案:

答案 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.autoPackLimitdefaults 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 年第二季度):

参见 commit 14e7b83(2021 年 3 月 19 日)、commit 2a15964commit 13d746acommit dab3247commit f25e33c(2021 年 3 月 5 日)和 commit 0fabafdcommit 339bce2commit c9fff00commit f62312e(2021 年 2 月 22 日)由 Taylor Blau (ttaylorr)
请参阅 commit ccae01cJunio C Hamano (gitster)(2021 年 3 月 5 日)。
请参阅 commit 20b031fcommit 6325da1commit fbf20aecommit 60bb5f2Jeff 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>]' 以指定哪种保留的包(如果有)应停止遍历。
这对于想要执行可达性分析但想要单独留下某些包的调用者很有用(例如,当进行几何重新打包时,它有一些保留在核心中的“大”包,它想单独留下) .

注意:这只是一个“内部使用”选项,但很有趣,可以根据您的情况进行实验。