如何删除git中有commit id但不可读的损坏提交

ddhy6vgd  于 2023-09-29  发布在  Git
关注(0)|答案(3)|浏览(97)

我有一个repo,当我运行git fsck --full时,我得到了一长串损坏的提交ID:

Checking object directories: 100% (256/256), done.
Checking objects: 100% (861/861), done.
error: Could not read 0f514378e088c610cbeb8b047c63d4209736d1f9
failed to parse commit 0f514378e088c610cbeb8b047c63d4209736d1f9 from object database for commit-graph
error: Could not read 1e77fe5a6c4bec9bc9bd7ac5c00f2bbe98249b44
failed to parse commit 1e77fe5a6c4bec9bc9bd7ac5c00f2bbe98249b44 from object database for commit-graph
error: Could not read 2a86db8a8c83ac0fdb5050efa63b518fbeaf8146
failed to parse commit 2a86db8a8c83ac0fdb5050efa63b518fbeaf8146 from object database for commit-graph
error: Could not read 2d898d27a8858cfba7db93f79ada3bdca181758d
failed to parse commit 2d898d27a8858cfba7db93f79ada3bdca181758d from object database for commit-graph
...
error: Could not read fc80facb8f8bf3a5972c51b2e9ae5e63552db2f0
failed to parse commit fc80facb8f8bf3a5972c51b2e9ae5e63552db2f0 from object database for commit-graph
Verifying commits in commit graph: 100% (28/28), done.

我只是不知道如何删除它们。我试了git gcgit prune,都不行...
我也有一个提交,可以显示为与git show <commit_id>的差异,但当我运行git branch --contains <commit_id>时,没有找到分支,所以我相信这是一个悬空提交,但同样,我尝试了我在谷歌上找到的一切。都不管用。
我试过的命令

git prune --expire now
git gc --prune=now
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch filename --prune-empty --tag-name-filter cat -- --all"
...
lymgl2op

lymgl2op1#

我在用git-repo-filter修改历史记录后得到了这个错误。使用以下命令修复了此问题:

git commit-graph write --reachable
hrysbysz

hrysbysz2#

我已经用以下命令解决了这个问题:

docker exec -t GitLab git -C /var/opt/gitlab/git-data/repositories/@hashed/30/48/3148905660916d5dde3add79e63f095af3ffb81604691f21cad442a85c7be617.git commit-graph write

我使用的是Docker Omnibus版本,所以你的命令可能会有点不同。在@hashed后面的路径中,您可以在GitLab项目的admin部分找到您的repo路径。

tv6aics1

tv6aics13#

我也有这个问题。结果发现我在.git/objects/pack目录下有两个临时文件“.tmp-xxxx-pack-xxxxxxxx...”。尝试这个在你自己的风险(我会备份你的整个源代码树第一TBH),但我删除了这些.tmp-..文件并重试git fsck -它工作得很好。

相关问题