Git object文件过大,导致push失败,提示413

最近在迁移git项目,其中有一个一直push失败,提示413

Total 2867 (delta 1104), reused 2867 (delta 1104), pack-reused 0
error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413
fatal: the remote end hung up unexpectedly

网上查说这是单文件太大,导致提交失败。在文件中找了半天,发现是.git文件下的objects文件夹下的pack文件有360M。

在 Git 中,.git/objects/pack 目录用于存储打包后的 Git 对象。

Git 对象包括提交(commit)、树(tree)和 blob(文件内容)对象等。随着时间的推移,Git 仓库中的对象数量可能会变得非常庞大。为了提高存储效率和性能,Git 会定期将松散的对象打包成 pack 文件存放在这个目录中。所以这个文件会越来越大

解决办法

1.找出这个文件下的大文件:

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

返回:

a2cc5177e68e65231a63009543273385ccce9450 nativeplugins/JG-JCore/ios/jcore-ios-3.2.5.a
08748acf3a60bf6d54b6f290d01593a4c4c6e8ba unpackage/debug/android_debug.apk
4c42c00c5832c588b9157c41e47375bb734eb3a7 unpackage/debug/android_debug.apk
dd6ff57225ef1a3fbfbc97523ca48e5c0a3cf6b3 unpackage/debug/iOS_debug.ipa
d07a667d4b36df4b318298374608d85b95829f3b unpackage/debug/android_debug.apk

2.删除大文件:

git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch YOUR-FILE-NAME' --tag-name-filter cat -- --all

或者直接删除文件夹:

$ git filter-branch --force --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch 文件夹名称' --tag-name-filter cat -- --all

这里我选择直接删除文件夹


Rewrite f887da52913316329887998af4e3e88422c84833 (2/55) (0 seconds passed, remaining 0 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
Rewrite 32758cdda93974985f60a0db81e9ec9de433d835 (3/55) (0 seconds passed, remaining 0 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
Rewrite dc031f875c72bc5faa92c00de062a2187bab8bf0 (4/55) (1 seconds passed, remaining 12 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
Rewrite c036ddb40b57dd8f2acffa5ef64bcd6220ab173f (4/55) (1 seconds passed, remaining 12 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
Rewrite c54e535c6e3a2c382fd0a71a2d1d2ddf901b97c3 (4/55) (1 seconds passed, remaining 12 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
Rewrite 85b7ede127ef4db1485cd28bee6722855767f4b8 (4/55) (1 seconds passed, remaining 12 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
Rewrite 77d1aed0bc17a5945ae92ba877db8ddb4f73fcce (4/55) (1 seconds passed, remaining 12 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
Rewrite 788629adf3f4ffa13f142970a89c80b5e027c677 (9/55) (3 seconds passed, remaining 15 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
rm 'unpackage/debug/iOS_debug.ipa'
Rewrite faf6fda49092984ee98770329ff19aa01a45e329 (9/55) (3 seconds passed, remaining 15 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'
rm 'unpackage/debug/iOS_debug.ipa'
Rewrite eb30c1ced228fb495bce4d4ed0b8eb9399c48ec0 (9/55) (3 seconds passed, remaining 15 predicted)    rm 'unpackage/debug/.roid.ins'
rm 'unpackage/debug/android_debug.apk'

回收

虽然上面我们已经删除了文件, 但是 repo 里面仍然保留了这些 objects , 等待垃圾回收(GC), 所以要用命令彻底清除它, 并收回空间,命令如下:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now

到这里,再去看.git/objects/pack文件的大小已经小很多了。

如果要将操作覆盖到远端,则执行命令:

git push --force --all

参考链接:

git 项目体积过大(object文件夹)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值