gpt4 book ai didi

Git 损坏 "unable to read [sha]"但 git fsck 报告没有错误

转载 作者:行者123 更新时间:2023-12-05 06:31:32 26 4
gpt4 key购买 nike

我有一个 git 存储库,其中似乎缺少一个 blob。 git gcgit repack 失败并提示“fatal: unable to read 89a9259486af9e3f0b24f3338ec39b18a7ba39c3”。但是,git fsck 没有发现问题。我知道我可能不得不删除和修剪某个地方的分支,但我不知道在哪里。有人可以告诉我如何调试和修复“无法读取”问题吗?

git 版本是 2.16.4,但有可能在 2.8.3 版本发生损坏。

blob 不存在于“官方”repo 中,因此它可能只属于本地分支/reflog/等。有很多地方分支机构和

这个 repo 上有很多工作树,它可能在其生命周期内添加、删除和修剪了工作树。

调试信息:

git repack -adfb --max-pack-size=256m --window=40 --window-memory=100m
计数对象:5999778,完成。
使用最多 4 个线程的增量压缩。
压缩对象:100% (5983452/5983452),完成。
警告:禁用位图写入,由于 pack.packSizeLimit,包被拆分
致命:无法读取 89a9259486af9e3f0b24f3338ec39b18a7ba39c3

我尝试了几个不同的 fsck 命令行,结果都相同:

$ > git fsck --cache --no-dangling --name-objects --progress
Checking object directories: 100% (256/256), done.
Checking objects: 100% (14155357/14155357), done.
Checking connectivity: 6003771, done.

.

git show 89a9259486af9e3f0b24f3338ec39b18a7ba39c3
fatal: bad object 89a9259486af9e3f0b24f3338ec39b18a7ba39c3

.

$ > git branch --contains 89a9259486af9e3f0b24f3338ec39b18a7ba39c3 --all
error: no such commit 89a9259486af9e3f0b24f3338ec39b18a7ba39c3

这是我之前出于其他目的从互联网上获取的脚本,但我认为它可能有帮助:

$ > /tmp/git_blob_to_commit.pl 89a9259486af9e3f0b24f3338ec39b18a7ba39c3
[no ouptput]

请注意,这是一个巨大的 repo 协议(protocol),因此 gc/repack 操作需要很长时间,所以如果你给我一些建议,我不会忽略它,我可能正在尝试,但需要几个小时才能得到告诉你它是怎么回事。

更新重新运行命令按 [return] 几次,您可以看到错误不在压缩阶段。它可能处于写作阶段。 (?)

Counting objects: 6006957, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5990610/5990610), done.
Writing objects: 19% (1193602/6006957)
warning: disabling bitmap writing, packs are split due to pack.packSizeLimit
Writing objects: 26% (1579434/6006957)
Writing objects: 63% (3802470/6006957)
fatal: unable to read 89a9259486af9e3f0b24f3338ec39b18a7ba39c3

最佳答案

这是一个棘手的场景,旧版本的 git 会错误地修剪工作树上索引实际使用的对象。

这是我采用的粗略方法。它肯定可以优化,但我希望永远不必再这样做。

for i in $(git worktree list | awk '{print $1}')
do
cd $i
echo "TITLE $i"
git ls-files --stage
done >> /tmp/blobs.txt # This is potentially a massive file

for i in $(cat /tmp/blobs.txt | awk '{print $2}') # Brute force, could be optimized
do
git show $i >/dev/null || echo "NOT FOUND $i"
done

对于每个“未找到”条目,运行 egrep "TITLE|<sha>" /tmp/blobs.txt找到它所在的工作树。然后转到工作树并取消索引中的任何内容。这应该可以解决问题。


感谢@torek 提供信息以得出此结论。 (你有足够的 SO 声誉,我认为你不会介意没有得到这个答案的分数。)

关于Git 损坏 "unable to read [sha]"但 git fsck 报告没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51789520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com