繁体   English   中英

git中损坏的文件和树

[英]Corrupted file and tree in git

我刚刚回到一个我几个月没碰过的仓库,它给了我一些奇怪的问题。

以下是一系列操作的结果:

>>> git status
[Works as expected] On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
  deleted:    app/views/steps/_self_service_code.html.erb
no changes added to commit (use "git add" and/or "git commit -a")

>>> git fsck --name-objects
Checking object directories: 100% (256/256), done.
Checking objects: 100% (11080/11080), done.
broken link from    tree 13f6a8bd586b1d5a80a3e67610fc1103fdd827ad (HEAD@{1595970321}^:app/)
              to    tree 9916bab22f21c3e8d77a0c4bb2e633ec26e45edb (HEAD@{1595970321}^:app/views/)
missing tree 9916bab22f21c3e8d77a0c4bb2e633ec26e45edb (HEAD@{1595970321}^:app/views/)
missing blob 9241fc61b7d8ede2f9c1081d97db7f4ae2dd81a7 (:app/views/steps/_self_service_code.html.erb)
...

>>> git restore app/views/steps/_self_service_code.html.erb
error: unable to read sha1 file of app/views/steps/_self_service_code.html.erb (9241fc61b7d8ede2f9c1081d97db7f4ae2dd81a7)

>>> git log --raw --all --full-history | grep 9916bab22f21c3e8d77a0c4bb2e633ec26e45edb
fatal: unable to read tree 9916bab22f21c3e8d77a0c4bb2e633ec26e45edb

>>> git log --raw --all --full-history | grep 9241fc61b7d8ede2f9c1081d97db7f4ae2dd81a7
fatal: unable to read tree 9916bab22f21c3e8d77a0c4bb2e633ec26e45edb

我已经尝试了我在网上读到的所有内容,包括从 Heroku 存储库中提取并在我的磁盘上运行“急救”(这是最近从 High Sierra 升级到 Catalina 的 Mac)。 到目前为止,没有任何东西可以解决这些问题。

Git 版本 2.28.0。

我已经重现了这个问题。 我创建了一个新的存储库并运行git ls-tree master

$ git ls-tree master
100644 blob 5cca282c0449f01cf317c3b4b7ed9f7d65125095    file-31e422aa.txt
100644 blob 03a9272a34f3085006cab8d7f1d6a45225a95a75    file-981ec394.txt
100644 blob 12c194b0694b456102f3ceaec027606b3b0b3edd    file-bf32de9c.txt
100644 blob 45aa64b2dfa1d0647be0d776c810eb493e882b23    file-f46b47e4.txt
040000 tree e560d2adfdbb678d625ca5de6f20abbc929f7092    moo

我删除了文件.git/objects/e5/60d2adfdbb678d625ca5de6f20abbc929f7092并运行了与您相同的命令:

$ git fsck --name-objects
Checking object directories: 100% (256/256), done.
error: e560d2adfdbb678d625ca5de6f20abbc929f7092: invalid sha1 pointer in cache-tree
broken link from    tree d0f8939f8d20cf252c1dd584526bcc6d7c3090e8 (:)
              to    tree e560d2adfdbb678d625ca5de6f20abbc929f7092 (:moo/)
missing tree e560d2adfdbb678d625ca5de6f20abbc929f7092 (:moo/)

由于克隆项目解决了您的问题,似乎提到的 git 对象在您的.git/objects文件夹中丢失/损坏。

选项 1 :将您的分支/存储移动到您克隆的存储库。

选项 2 :将损坏的 git 对象从克隆的存储库移动到损坏的存储库中。

选项 2 应该可以正常工作。 您可以仅移动 CLI 输出中提到的两个对象,也可以复制并粘贴整个.git/objects文件夹并将其与损坏的存储库的.git/objects内容合并(而不是覆盖!)。 无论如何,我建议您在尝试解决问题之前创建当前损坏存储库的完整副本。

注意:请注意.git/objects文件夹的文件夹结构。 它包含两个字符的文件夹,其中两个字符代表对象哈希的开头。 例如,您损坏的9916bab22f21c3e8d77a0c4bb2e633ec26e45edb树将位于.git/objects/99/16bab22f21c3e8d77a0c4bb2e633ec26e45edb中。

暂无
暂无

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

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