Table of Contents
一. 上传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