繁体   English   中英

Git rev-list 找不到提交

[英]Git rev-list cannot find commit

当我运行时:

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 run git gc但结果相同。

对象可能会被放弃,即它的最后一个引用,无论它们是什么,现在都消失了。 但是,由于对象位于包文件中,因此不能简单地将其删除。 Git 必须构建一个全新的包。

如果您使用git repack构建新包文件,则新包中将省略任何未引用的对象。 (请注意, git gc会自动执行此操作。但是,如果您创建了.keep文件, .keep文件可能会保留旧包。)

编辑:正如jthill 在评论中指出的那样,您必须使用-a-A重新打包以合并旧包。 虽然在某些情况下自动git gc会提供-A ,但只有当包文件的数量超过gc.autoPackLimit默认为 50

我在 git help stash 的底部找到了这个,以查找未引用的提交。

git fsck --unreachable |
grep commit | cut -d\  -f3 |
xargs git log --merges --no-walk --grep=WIP

首先,我会检查该引用是否仍在该 idx 文件中

git gc
git repack -Ad      # kills in-pack garbage
git prune           # kills loose garbage

使用 Git 2.32(2021 年第二季度)考虑:

提交14e7b83 (2021年3月19日), 提交2a15964提交13d746a提交dab3247提交f25e33c (2021年3月5日),以及提交0fabafd提交339bce2提交c9fff00提交f62312e由(2021年2月22日)泰勒布劳( ttaylorr
请参阅Junio C gitster ( gitster ) 的commit ccae01c (05 Mar 2021 )
请参阅Jeff King ( peff ) 的commit 20b031fcommit 6325da1commit fbf20aecommit 60bb5f2 (2021 年 2 月 22 日
(由Junio C gitster合并-- gitster -- in commit 2744383 ,2021 年 3 月 24 日)

revision :学习'--no-ket-objects'

签字人:Taylor Blau
审核人:杰夫·金

未来的调用者将希望能够执行可达性遍历,该遍历在访问保留包中找到的对象时终止。
最接近的现有选项是“ --honor-pack-keep ”,但这并不是我们想要的。
不是在中途停止遍历,而是始终执行完整遍历,并且结果仅在后记中被修剪。

除了需要引入一个新标志(因为事后剔除结果可能与在遍历发生时停止遍历不同),还有一个额外的问题处理内核和磁盘保存包的区别。
即:什么样的保持包应该停止遍历?

引入“ --no-kept-objects[=<on-disk|in-core>] ”来指定哪种保留的包(如果有)应该停止遍历。
这对于想要执行可达性分析但想要单独留下某些包的调用者很有用(例如,当进行几何重新打包时,它有一些保留在核心中的“大”包,它想单独留下) .

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM