最近在迁移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
1703

被折叠的 条评论
为什么被折叠?



