[英]Excluding `commit …` lines from `git rev-list` command output
[英]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 年第二季度)考虑:
git repack
现在快多了git rev-list
自 2016 年以来有了新选项见提交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 20b031f 、 commit 6325da1 、 commit fbf20ae 、 commit 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.