Git大对象读取报错:无法恢复含大文件的历史提交数据求助
Git大文件恢复报错与文件找回方案
问题详情
创建空仓库后,提交了包含大于1GB电影文件的内容至commit ca8d0e1(提交信息:Status am 27.02.2024)。之后误删文件并执行了提交或撤销操作,git reflog输出如下:
git reflog eda6237 (HEAD -> main) HEAD@{0}: commit: added gitignore 6d0c8ba (origin/main, origin/HEAD) HEAD@{1}: reset: moving to 6d0c8ba0b339426173d04a2c4676ff5d3db8b4d3 [1fd5502251ec0eb7a17e8dbe7b4bd73514881572] ca8d0e1 HEAD@{2}: commit: Status am 27.02.2024 6d0c8ba (origin/main, origin/HEAD) HEAD@{3}: clone: from https://git.uibk.ac.at/csaw1192/bachelorarbeit.git
执行git reset --hard ca8d0e1恢复时触发报错:
git reset --hard ca8d0e1 fatal: object too large to read on this platform: 15531648537 is cut off to 2646746649
目前仅恢复部分数据,电影文件丢失,需找回数据或恢复当时的文件结构。
解决步骤
1. 恢复文件结构(不含大文件内容)
若仅需还原目录和文件结构,无需大文件内容,可执行以下操作:
- 列出
ca8d0e1提交下的所有文件路径:git ls-tree -r --name-only ca8d0e1 - 将结构导出到文件,方便后续重建:
git ls-tree -r --name-only ca8d0e1 > file_structure.txt - 根据导出的文件内容,手动或通过脚本批量创建对应的目录和空文件。
2. 尝试找回大文件内容
报错原因是32位系统对Git大文件支持有限(超过4GB的对象会被截断),优先尝试以下方案:
- 切换到64位环境操作:在64位系统重新克隆仓库,再执行
git reset --hard ca8d0e1,通常能正常恢复大文件。 - 单独提取大文件Blob对象:
- 找到电影文件对应的Blob哈希:
输出第二列即为Blob哈希(如git ls-tree -l ca8d0e1 | grep "你的电影文件名关键词"a1b2c3d4)。 - 尝试导出Blob内容:
git cat-file blob a1b2c3d4 > 电影文件名.mp4
- 找到电影文件对应的Blob哈希:
- 升级Git版本:更新到最新版Git,新版对大文件处理逻辑更完善,可能解决截断问题。
3. 检查本地对象库
Git对象存储在.git/objects目录下,可手动检查目标对象是否存在:
- 提交
ca8d0e1的对象路径为.git/objects/ca/8d0e1xxxxxx(前两位字符为目录名,剩余为文件名) - 若大文件的Blob对象存在,可尝试用文件读取工具直接读取该文件内容。
内容的提问来源于stack exchange,提问作者moinmoin
相关产品推荐
相关产品推荐

