git error: remote unpack failed

本文详细解析了在使用Git上传超过服务器限定大小的文件时所遇到的问题,并提供了具体的操作步骤来解决这一问题,包括如何定位大文件、从暂存区删除大文件以及如何优化Git仓库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 remote unpack failed` 错误提示对象过大时,通常是因为远程仓库设置了最大对象大小限制 (max object size limit),而本地提交中的某个文件超出了该限制。以下是针对此问题的解决方案: #### 方法一:调整 Git 配置以忽略大文件 可以通过 `.gitattributes` 文件配置特定类型的文件不被追踪或者通过 LFS(Large File Storage)来管理这些大文件。 1. **创建或修改 .gitattributes 文件** 将需要排除的大文件类型加入到 `.gitattributes` 中: ```bash *.psd filter=lfs diff=lfs merge=lfs -text ``` 2. **安装并启用 Git LFS** 如果尚未安装 Git LFS,则可以运行以下命令进行安装和初始化: ```bash git lfs install git add .gitattributes git commit -m "Enable Git LFS" ``` 3. **迁移现有大文件至 LFS** 使用以下命令将现有的大文件迁移到 LFS 存储中: ```bash git lfs track "*.psd" git rm --cached $(find . -name '*.psd') git add . git commit -am "Migrate large files to LFS" ``` 上述操作会确保未来所有的 PSD 文件都由 LFS 处理[^1]。 --- #### 方法二:分割或移除大文件后再重新提交 如果不想使用 LFS 或者无法更改服务器端设置,可以选择手动处理大文件。 1. **查找导致错误的大文件** 可以利用以下脚本定位存储库中最占空间的对象: ```bash git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')" ``` 2. **删除历史记录中的大文件** 利用 BFG Repo Cleaner 工具清理掉不必要的大文件: ```bash java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git cd my-repo.git git reflog expire --expire=now --all && git gc --prune=now --aggressive ``` 完成以上步骤后再次尝试推送到远程分支即可[^2]。 --- #### 方法三:请求管理员提高服务端的最大对象尺寸限制 部分托管平台允许自定义其内部参数如 `http.postBuffer` 和接收缓冲区容量等。联系项目维护人员询问是否可能临时放宽规则以便顺利完成此次上传工作。 例如,在 GitHub Actions 的 CI 流水线里可增加环境变量声明如下所示: ```yaml env: GIT_LFS_SKIP_SMUDGE: true steps: - name: Set up Git config for larger file uploads run: | git config http.postBuffer 524288000 ``` 这一步骤增大了 HTTP POST 缓冲器大小从而支持更大规模的数据传输需求。 --- ### 注意事项 无论采取哪种方式解决问题,请务必先备份当前的工作目录以防意外丢失重要数据! ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值