前言
代码仓体积大,大概1.7G,git clone时报错,
背景:早期前端不是自动化打包,开发本地打包后 压缩成zip包push到git库交给同事放到服务器。
fatal: the remote end hung up unexpectedly1 MiB | 4.27 MiB/s
fatal: early EOF
体积大原因
- 版本历史(每次提交包括文件的不同版本、元数据等)都会被存储在 Git 仓库中。如果你曾经有过大文件被添加到仓库中,后来虽然删除了,但这些文件的历史记录仍然会存在于仓库;
- Git 虽然会对文件进行压缩存储,但这种压缩并不一定能使仓库的大小显著减小。一些二进制文件(如图片、视频、大型文档等)本身的压缩效果可能有限。而且,如果仓库中曾经包含过这些文件,即使被删除了,也可能会影响仓库的整体大小;
- 项目包含子模块,git clone主项目时,默认情况下只会克隆子模块的引用而不下载实际内容。但使用了–recursive参数 会克隆子模块的内容。如果子模块本身比较大就会导致内容很大;
解决方式
一、浅克隆
- clone 最近100次提交, 参数正整数即可。 你如果不需要完整的仓库,可以添加分支参数,并且只需要执行第一步
git clone --depth 100 git地址
- 从远程仓库获取完整的提交历史,使本地仓库变为完整克隆
git fetch --unshallow
-
查看所有分支。还是只有默认分支,继续执行 git fetch --unshallow,git提示: 在完整的库中执行没有意义
-
查看抓取配置,发现只有 master, 那么问题就出在这里,修改一下
// 查看抓取配置
git config remote.origin.fetch
//输出: +refs/heads/master:refs/remotes/origin/master
// 修改一下 重新查看
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git config remote.origin.fetch
//输出: +refs/heads/*:refs/remotes/origin/*
- 更新本地仓库, 查看分支,成功
git remote update
二、清理版本历史
git filter-branch 命令重写提交历史时,它会改变原有的提交结构和相关信息。在很多协作式的 Git 仓库环境中,远程仓库会设置预接收(pre-receive)钩子(hook),来验证你是否在推送别人的提交。
如果你的项目从开始阶段只有你维护、只有你的提交历史,你可以直接尝试。
你确保你的远程仓库没有这个hook,或者你有足够权限能修改hook,你也可以尝试。
否则,你需要联系管理员,协助你临时修改预接收钩子的配置,允许你这次的推送。