给 github 仓库瘦身

臭大佬 2020-10-08 15:45:47 166
Git 
简介 给 github 仓库瘦身

问题

随着我们提交代码次数的增多,你会发现 Git 包变得越来越臃肿,尤其是上传大文件上去的时候,当你删除文件时,其实 .git目录下的大文件对象是不会被删除的。 Git 会把文件的每一个差异化版本都记录在案。这意味着,即使你只改动了某个文件的一行内容,Git 也会生成一个全新的对象来存储新的文件内容。

由于没太注意,我的项目 laravel-wjfcms,上传过许多大文件,之前为了找一个好看的背景,上传了好些几个G大小的壁纸上去,还有测试的时候把 .exe文件扔上去过,再加上国内访问github本来就龟速了,导致项目很多时候无法下载。

E:\www\siren>git clone https://github.com/Galloping-Vijay/laravel-wjfcms.git
Cloning into ‘laravel-wjfcms’…
remote: Enumerating objects: 977, done.
remote: Counting objects: 100% (977/977), done.
remote: Compressing objects: 100% (492/492), done.
effrror: RPC failed; curl 18 transfer closed with outstanding read data remaining
atal: the remote end hung up unexpectedly
atal: early EOF
fatal: index-pack failed

放弃当前包,重新建一个,感觉还是有感情的,不想放弃这个包,那怎样才能解决下载问题呢?

尝试过的方法

修改上传大小

看网上说这可能是上传大小限制造成的,

git config http.postBuffer 524288000

运行如上命令并没有什么效果。

修改 host 文件

其实下载只是慢一点,访问github还是没有问题的,别的 github项目拉去速度都还可以,就自己的拉去不下来,所以可以排除 本地DNS 问题

清理大文件

之前有尝试过清理.git文件夹下面的大文件,操作在文章 github仓库中删除历史大文件 中有说明。但是效果并不好。

终极大法 — 删除版本记录

git包那么大,其实很多都是log及版本记录造成的,版本记录里面包含了所有文件的更改记录,我的目的是:在不重建git的前提下,仅保留当前版本,把之前所有的commit都删除掉,以此来减小包的大小。

思路

新建一个分支 mains 然后把 master 分支的文件全部添加到 mians 分支中,然后本地和远程都删除master分支,再把mains分支重命名为master,从而清理之前的提交记录。

新建并切换到分支mains
git checkout --orphan mains
添加并提交文件到mains分支
git add -A

git commit -am "清除所有历史版本以减少仓库大小"
删除 master
git branch -D master
mains 重命名
git branch -m master
强制推送
git push -f origin master

如果主分支改变,别的分支没有进行操作的话,将无法从主分支中合并代码到别的分支,最好本地拉取目标分支的文件,然后备份一份,再删除目标分支,从master分支基础上新建目标分支。然后再覆盖备份的文件。
简单操作如下

# 切换目标分支(以blog为目标分支为例)
git checkout blog
# 拉去仓库blog分支的最新版本 
git pull 
# 本地备份
# 删除分支
git branch -D blog
# 在master分支下创建分支
git chekcout blog
# 覆盖代码
# 强制推送到远程
git push -f -u origin blog

如果代码已经部署到网站中,那么需要强制拉取,不然本地会有很多 commit

git fetch --all
git reset --hard origin/blog
git pull