Git提交单个文件过大,git error: remote unpack failed:error Object too large

Posted 执笔记忆的空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git提交单个文件过大,git error: remote unpack failed:error Object too large相关的知识,希望对你有一定的参考价值。

Table of Contents

一. 上传git出错

二. git基本概念

三. 解决

参考链接


一. 上传git出错

error: remote unpack failed: error Object too large (136,179,501 bytes), rejecting the pack. Max object size limit is 104,857,600 bytes.
 Please refer to http://x.code.com/Code/Git/blob/master/help/solutions/lfs/use_lfs_transfer.md
To https://git.code.com/xxxsun/bspcloud_docs
 ! [remote rejected] master -> master (n/a (unpacker error))
error: failed to push some refs to 'https://git.code.com/xxxsun/bspcloud_docs'

分析上述报错信息,服务器限制上传的对象大小限为100M,但当前对象大小129M,超出系统限制而出错。

 

二. git基本概念

Git 由工作区、暂存区、版本库三部分组成。

执行 git add 时暂存区的目录树被更新,工作区修改内容被记录在对象库中,暂存区目录树被更新。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

 

Git 目录结构:

index       暂时区,索引
objects    对象库
HEAD     HEAD指针,指向当前分支
refs/refs/heads/master  最近一次commit id

 

三. 解决

通过上述分析,需直接剔除那个大文件,再重新上传。但此时暂存区已经被修改,无法执行git push,需要重建目录树。

查看对象库:

ls -l .git/objects/pack
-r--r--r--  1 xxxsun  staff    54K Feb 20 20:30 pack-f49501cbd6851d3cbdf8ad44028263e2b1526b32.idx
-r--r--r--  1 xxxsun  staff   118M Feb 20 20:30 pack-f49501cbd6851d3cbdf8ad44028263e2b1526b32.pack

查看最大的N个文件sha1:

git verify-pack -v .git/objects/pack/pack-f49501cbd6851d3cbdf8ad44028263e2b1526b32.idx | sort -k 3 -n | tail -n 10
5f466dec2fc24624d09790c369e5ad1e5343ec61 blob   8377466 8351646 110662168
8c915661c66e9b3a9ec9e17c9b55fb4bdaf152fc blob   9162783 6558772 101211526
8533ba160d286563df5b7bd774b2814a46b64857 blob   20848460 16287722 8254071
0b98ac11ba523cc7c58459548dc52c68135e3862 blob   20876763 3485525 94296622
b56c8f61a3c9f153a9064ef3c888fb6051307212 blob   39627800 25196894 69099728

查看sha1对应文件名:

git rev-list --objects --all | grep b56c8f61a3c9f153a9064ef3c888fb6051307212
b56c8f61a3c9f153a9064ef3c888fb6051307212 产品文档/xxx系统-产品团队补充部分v2.2.pdf

发现比较大的几个文件均为*.pdf,从暂存区删除:

$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.docx' -- --all
$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
$ git gc --aggressive --prune=now

 

验证:
git count-objects -v

重新提交成功

但是上面的步骤过于繁琐,只是为了学习git工作原理。不得不说git支持命令之丰富。最简洁的方式 git clone 主工程,过滤比较大的文件后再上传。
 

参考链接

https://github.com/18F/C2/issues/439

以上是关于Git提交单个文件过大,git error: remote unpack failed:error Object too large的主要内容,如果未能解决你的问题,请参考以下文章

git 超过100M文件的解决方法

.git文件过大!删除大文件

Git:恢复单个文件的旧提交

git如何获取单个文件的提交时间

Git:将单个文件还原为其最后一次提交[重复]

怎么git clone 单个文件