不良的SHA1文件处理

8

当我在远程仓库(GIT服务器)上执行git fsck --full --no-dangling时,出现了以下错误。

user@server:/var/git/REPOSITORY.git$ git fsck --full --no-dangling
bad sha1 file: ./objects/15/19d8eeacc8d0cd603bd87d2034508b1ffaffa8_28537991145d7e9d87b68335e9b82c2f788cb4fc
bad sha1 file: ./objects/32/4f425bcfe23d9f38b154427eeb9c800d109365_6df2d745fff22839759b25cc83f8d742c2e64086
bad sha1 file: ./objects/42/9225fd8d895084051189dc6478343d54fe41c8_28537991145d7e9d87b68335e9b82c2f788cb4fc
bad sha1 file: ./objects/46/798e4a01a5a7eaf2b203f6d1634d603497041b_6df2d745fff22839759b25cc83f8d742c2e64086
bad sha1 file: ./objects/bc/fb9d62ac05d5203249caa0e7e9cb5d1c32daba_6df2d745fff22839759b25cc83f8d742c2e64086
bad sha1 file: ./objects/cd/477947092b4f20feba8c37df974027b1864215_6df2d745fff22839759b25cc83f8d742c2e64086
Checking object directories: 100% (256/256), done.
Checking objects: 100% (136737/136737), done.
missing commit 590ebc3ac022491d7f11c483480fa9530adc91e8
missing tree bab1d768f0d4f6a02e0a30a6c446afaeabc4aa71

每个不好的sha1文件都有另一个以相同名称开头但没有下划线_和其他一些文本的文件。这些文件具有完全相同的文件大小,但日期或时间不同。

以下是两个文件的示例:

./objects/15/19d8eeacc8d0cd603bd87d2034508b1ffaffa8_28537991145d7e9d87b68335e9b82c2f788cb4fc
./objects/15/19d8eeacc8d0cd603bd87d2034508b1ffaffa8

我正在附上两个案例的屏幕截图,因为它们都是相同的:
屏幕截图1: 文件1 屏幕截图2: 文件2 我能删除重复的吗?会发生什么?
*有关缺失的提交\树的任何想法?

如果您正在使用远程存储库,请尝试进入该存储库所在的服务器并比较这些文件。在远程服务器上尝试运行 git fsck,如果一切正常,则只需删除本地存储库并执行 git clone - Vlad Nikitin
问题出在远程,错误也出在远程。 - Mike
2个回答

3

首先,因为这个问题出现在服务器上,检查一下是否有任何克隆版本没有显示相同的问题:您可以从那个克隆版本中创建一个本地裸仓库克隆,并用该裸仓库的副本替换 "user@server:/var/git/REPOSITORY.git"。

其次,在服务器上:
只需将 user@server:/var/git/REPOSITORY.git 复制到 user@server:/var/git/REPOSITORY2.git,删除那些 '_' 文件,看看错误是否仍然存在。
我猜测:缺失的提交和树仍将存在。
这意味着您需要在一个克隆版本中查找它们以恢复它们,就像我在 "如何诊断和修复 git fatal: unable to read tree" 中建议的那样。
请参阅更多信息,"如何修复损坏的 git 存储库?"


奇怪,缺失的树和提交似乎不知何故消失了,我真的不理解!删除sha1文件修复了它,因为它们与任何东西都没有连接。现在用REPO.GIT文件夹覆盖新的REPO_TEST.GIT是安全的吗?只需删除原始文件并将测试文件重命名为原始名称即可吗?所有连接到它的用户将保持连接,就像旧的一样吗? - Mike
@user1725378 我建议移动旧文件,并将新文件重命名,而不是覆盖原有文件。 - VonC

0
这是我对我认为的同样问题的解决方法。欢迎反馈。
命令高亮问题:
git fsck --full --no-dangling
bad sha1 file: ./objects/e2/6eb31e9013bda60158eb9d63d4500e005b2911 (2016-04-18 09-12-50)

ls -alh objects/e2/6eb31e9013bda60168eb9d63d4600e006b2911*
-rwxrwxrwx 1 Unknown+User Unknown+Group 1.1K Sep  7 18:33  objects/e2/6eb31e9013bda60168eb9d63d4600e006b2911
-rwxrwxrwx 1 Unknown+User Unknown+Group 1.1K Sep  7 18:33 'objects/e2/6eb31e9013bda60168eb9d63d4600e006b2911 (2016-04-18 09-12-50)'

我的解决方案:

# Create New Repository
cd /tmp
git init --bare --shared repo_new

# Export commits from repo_old and import into the repo_new
#
# https://git-scm.com/docs/git-fast-export
# git fast-export --all | (cd /empty/repository && git fast-import)

cd repo_old
git fast-export --all | (cd /tmp/repo_new && git fast-import)

注意:在这一步之后,我只是删除了旧的克隆实例并克隆了这个新的git存储库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接