硬盘损坏后Git分支currency-convertor无法读取树对象的恢复咨询
Git磁盘损坏后恢复currency-convertor分支文件的问题
硬盘损坏后,我尝试恢复存储在currency-convertor分支上的项目文件,但执行git checkout currency-convertor时弹出错误:
fatal: unable to read tree 41d648e8fd1281a8cdb1fcadb10daac5f7be2d39
我查过资料尝试恢复但没成功,奇怪的是只有currency-convertor分支受影响,磁盘故障时我正处于其他分支。想问问能不能至少恢复部分文件,附上git fsck --full的输出:
Checking object directories: 100% (256/256), done. Checking objects: 100% (173/173), done. broken link from tree 5f9cd50454c698571ef96c2f037773890bde4a23 to blob 5e76c750eeaeb2b07542d07dc3a925999e8aaa2f broken link from tree 5f9cd50454c698571ef96c2f037773890bde4a23 to blob 63a23f89e10d31c3a9ed9ca582e83a8a05204b96 broken link from tree 5f9cd50454c698571ef96c2f037773890bde4a23 to tree 41d648e8fd1281a8cdb1fcadb10daac5f7be2d39 broken link from tree 5f9cd50454c698571ef96c2f037773890bde4a23 to blob 217069b72a199c7be5b4fd8ae45e0b93a1f36b85 broken link from tree 8f79d8e655ff8fd4e6b4516f6fefb4bc8ba02c3c to blob e50ee4159db60c92f144c4b33f45bd1a57ebd6ff broken link from tree d1281c46e3f1d36eea7d8e5be3b4cdd2a120a2fd to blob fcaca083555ace75f54451698da96f98688a4709 broken link from tree d1281c46e3f1d36eea7d8e5be3b4cdd2a120a2fd to blob 7d1296959b427b97cf52812566b74fd38da0e0ae broken link from tree f8b71bc6088fb8f8422a40a5b212b3cabd8ddb66 to blob e8567005d36f967f7d852313b82767c04ab155a8 broken link from tree f8b71bc6088fb8f8422a40a5b212b3cabd8ddb66 to blob f20377b3d16a0e580834e0438954cf9bba291fdf broken link from tree f70049a236deb0e215d5483fe9df3a0cbba88ceb to blob e7280e8dac5c31d348f093a33172b2282149b064 broken link from tree f70049a236deb0e215d5483fe9df3a0cbba88ceb to blob 04f62a6068ea0cf89229a0c7579df0f2c0aa7ed1 broken link from tree b5d32fbe8e6c2832ddd37625370e221837a176c8 to blob 55aa349b8516fb9a5b4d71a1c34ca8c1b1715e34 broken link from tree b5d32fbe8e6c2832ddd37625370e221837a176c8 to blob 536346328a8d35ab7b62cf4b43db3bb307064f24 broken link from tree a1b26b4af971808beec0e8c2fb4797d7ef6cca42 to blob 1f48f7a7a8c10175c8b0d0814f091ce4247cfd24 broken link from tree a1b26b4af971808beec0e8c2fb4797d7ef6cca42 to blob df85d005e45adba5d9802b42d38ae07c00cf931a broken link from tree 3bdebb7bf8c1edbe618d7cc4eec1af2a35e89c31 to blob a82bcd60f583bdd9165b048bfc91df1b6a60eb22 broken link from tree 3bdebb7bf8c1edbe618d7cc4eec1af2a35e89c31 to blob c55ee0ed8d8bcc7ad581fdfeca14e1daa5a86f8a missing blob 04f62a6068ea0cf89229a0c7579df0f2c0aa7ed1 missing blob 1f48f7a7a8c10175c8b0d0814f091ce4247cfd24 missing blob 217069b72a199c7be5b4fd8ae45e0b93a1f36b85 dangling commit 317044625dfc11b9757ca4807e228c09eb5eb6e8 missing tree 41d648e8fd1281a8cdb1fcadb10daac5f7be2d39 missing blob 55aa349b8516fb9a5b4d71a1c34ca8c1b1715e34 missing blob 5e76c750eeaeb2b07542d07dc3a925999e8aaa2f missing blob 63a23f89e10d31c3a9ed9ca582e83a8a05204b96 dangling commit 6bb4969cfc01bd1741b86c6f45c310fe766879ad missing blob 7d1296959b427b97cf52812566b74fd38da0e0ae missing blob c55ee0ed8d8bcc7ad581fdfeca14e1daa5a86f8a missing blob e50ee4159db60c92f144c4b33f45bd1a57ebd6ff missing blob e7280e8dac5c31d348f093a33172b2282149b064 missing blob e8567005d36f967f7d852313b82767c04ab155a8 missing blob fcaca083555ace75f54451698da96f98688a4709 missing blob 536346328a8d35ab7b62cf4b43db3bb307064f24 dangling commit 6313128d5b4b49f0b2900ebbe21dc17eea708c25 missing blob a82bcd60f583bdd9165b048bfc91df1b6a60eb22 missing blob df85d005e45adba5d9802b42d38ae07c00cf931a missing blob f20377b3d16a0e580834e0438954cf9bba291fdf
恢复方案
1. 优先检查悬空提交
git fsck输出里的dangling commit是没被分支引用但还残留在Git里的提交,大概率包含你需要的文件内容:
- 逐个查看悬空提交:
git show 317044625dfc11b9757ca4807e228c09eb5eb6e8 git show 6bb4969cfc01bd1741b86c6f45c310fe766879ad git show 6313128d5b4b49f0b2900ebbe21dc17eea708c25 - 如果找到匹配
currency-convertor分支的提交,直接把它恢复成新分支:git checkout -b recovered-currency <提交哈希>
2. 从完整树对象提取可恢复文件
报错里的缺失树41d648e8fd...是从树5f9cd50454...引用的,先查看这个父树里的可用文件:
- 列出父树的所有条目:
git ls-tree 5f9cd50454c698571ef96c2f037773890bde4a23 - 对输出里没有标记为missing的blob对象,用以下命令导出内容并保存到本地:
git cat-file -p <blob哈希> > 文件名
3. 尝试抢救Git对象文件
Git的所有对象都存在.git/objects目录下,按哈希前两位分文件夹存储。比如缺失的blob5e76c750eea...对应.git/objects/5e/76c750eeaeb2b07542d07dc3a925999e8aaa2f:
- 检查这个文件是否存在,若只是损坏,用磁盘恢复工具扫描磁盘找回该文件
- 如果找回,直接放回原目录,再执行
git fsck验证是否修复
4. 手动重建分支
如果以上方法都没找回全部内容,只能手动重建:
- 创建临时分支:
git checkout -b temp-recovery - 把能提取到的文件全部添加到分支,提交临时版本
- 结合记忆或其他备份补全缺失的文件内容
内容的提问来源于stack exchange,提问作者Bonifacy
相关产品推荐
相关产品推荐

