张小弟博客

梦想需要付诸行动,否则只能是梦

Git 仓库体积过大,如何减小?

其实从很早之前我就发现我的git仓库变得很大了,主要是有一次一不小心直接提交了个200多兆的高清图片文件夹上去,然后之后的代码提交等一系列操作都变得很...难受。一直想要清理一下git仓库,但是每次百度,都是给出一堆命令,根本就不知道那个命令是什么意思,也没有说要往哪里输入之类的(原谅我还是个小白)。直到今天...当我提交到仓库的时候...仓库炸了......上个截图

image.png

从图上可以清楚的看到,我的仓库文件已经有超过1G了,超过了最大容量限制,根据Gitee的GNK说明,三次读没有减小存储库体积,则便无法继续修改远程存储库,如下图(下方截图来源于文章 《Gitee 存储库体积控制策略》https://my.oschina.net/GIIoOS/blog/3126211)

image.png

所以必须要清除一些仓库中没用的大文件了,不仅仅是因为为了压缩到500Mb以内,更重要的是每次下载仓库那个时间简直是太长了,国内gitee还可以勉强忍受,这要是github,那简直是要炸了。

下图是Gitee平台对仓库的配额限制,我使用的是免费版,单仓库只有500MB。

image.png

于是,说干就干,先从百度上搜集一些教程如下:

git 仓库中删除历史大文件 https://www.cnblogs.com/langzou/p/9877165.html

删除 git 仓库中无用大文件 https://www.cnblogs.com/oloroso/p/13367120.html

然后,我又找到了Gitee的官方文档

仓库体积过大,如何减小? https://gitee.com/help/articles/4232


我一开始是按照第一个教程来的,但是一通操作下来,仓库容量反而不降反升,直接懵B...

后来看到上图中的HelpLink(https://gitee.com/help/articles/4232),抱着试试看的心情试了一下,结果...还是没啥作用,仓库更大了(让我冷静一下.gif)

俗话说的好,遇到问题要冷静。(咳咳咳别打岔)

然后发现Gitee仓库设置里面有一个“存储库 GC”的选项,点了之后,仓库奇迹般的小了下来。(其实现在回头想想,变小也是正常的了,上面的教程主要还是让我们把大文件从历史记录中删除,但是只是删除了历史纪录和大文件之间的链接,GC回收之后,大文件才真正的从Git仓库中删除),下图是从《Gitee 存储库体积控制策略》中选取的截图,地址:https://my.oschina.net/GIIoOS/blog/3126211

image.png


下面,我就来记录一下从上面这些教程中学到的东西吧。


首先,git仓库中删除历史大文件分为以下步骤:

查找大文件id→根据id查找大文件所在的路径→删除文件→删除文件的历史记录→提交→清除本地缓存

(我按照我的理解总结的,不知道是不是对的,如果有错误的话,麻烦大家在下面评论区纠正一下,谢谢!)


具体的命令如下:【ps:后面有更简单的代码,如果想要直接用的话可以直接看本文后面】

1. 显示10个最大的文件id列表

git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10

结果类似下图(从左往右依次是文件ID、文件类型、文件字节数、size-in-packfil、offset-in-packfile),列表越往下,文件越大

image.png

其实,往专业点来说,文件ID其实是SHA1,不过不知道这是啥也没关系。


2. 根据文件id查询文件路径

git rev-list --objects --all | grep 【大文件id】

【大文件id】填上面步骤1中的id,例如上图最后一个id为:6b79eb68b19d7921a433ba01e2c6deb73e758990

则命令为:git rev-list --objects --all | grep 6b79eb68b19d7921a433ba01e2c6deb73e758990

结果如下

image.png

图中涂白的地方则为大文件所在的Git仓库路径,复制下来备用


3. 移除文件

git log --pretty=oneline --branches -- 【your_file】

【your_file】那里填上一步得到的涂白的路径,类似于下面这样:

$ git log --pretty=oneline --branches -- a/b/c/xyz.zip

然后应该没有输出,接着进行下一步就好。


4. 删除文件的历史记录

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch --ignore-unmatch 【your_file】' --prune-empty --tag-name-filter cat -- --all

【your_file】那里还是填第2步得到的涂白的路径,类似于下面这样:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch --ignore-unmatch a/b/c/xyz.zip' --prune-empty --tag-name-filter cat -- --all


接下来就要稍等一下了,如下图,提交的版本越多,需要等待的时间越长。

image.png


3、4步注意

【注意】如果文件名有空格,则需要用双引号引起来,例如:

$ git log --pretty=oneline --branches -- "a a/b b/c c/xyz.zip"

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch --ignore-unmatch "a a/b b/c c/xyz.zip"' --prune-empty --tag-name-filter cat -- --all


5. 提交

git push --force --all

【注意】这一步需要输入Git的账号和密码,因为我用的是Gitee,所以输入了码云的登录账号和密码

另外,如果出现提示remote: GitLab: You are not allowed to force push code to a protected branch on this project.

需要在gitlab里面取消分支protected


6. 清除本地缓存

rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune


然后,我看到了Gitee的官方文档(https://gitee.com/help/articles/4232),试着操作了一下,发现简单不少,于是下面介绍一下这个相比较而言简单一些的方法:

首先,查看存储库中的大文件:

1. 查看存储库中的大文件

git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`

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


2. 改写历史,去除大文件

注意:命令中的 path/to/large/files 是大文件所在的路径,千万不要弄错!

git filter-branch --tree-filter 'rm -f path/to/large/files' --tag-name-filter cat -- --all
git push origin --tags --force
git push origin --all --force

如果在 git filter-branch 操作过程中遇到如下提示,需要在 git filter-branch 后面加上参数 -f

Cannot create a new backup.

A previous backup already exists in refs/original/

Force overwriting the backup with -f

并告知所有组员,push 代码前需要 pull rebase,而不是 merge,否则会从该组员的本地仓库再次引入到远程库中,导致仓库在此被 Gitee 系统屏蔽。


3. 执行存储库GC

按照下图操作即可。

image.png

image.pngimage.png

然后,去仓库数据统计刷新一下仓库大小即可,大功告成!

image.png

张小弟之家

本文链接:
文章标题:

本站文章除注明转载/出处外,均为原创,若要转载请务必注明出处。转载后请将转载链接通过邮件告知我站,谢谢合作。本站邮箱:admin@mail.only4.work

尊重他人劳动成果,共创和谐网络环境。点击版权声明查看本站相关条款。

    打赏

    发表评论:

    本文二维码
    搜索
    标签列表
    站点信息
    • 文章总数:176
    • 页面总数:20
    • 分类总数:67
    • 标签总数:108
    • 评论总数:19
    • 浏览总数:21689
    • 订阅本站的 RSS 2.0 新闻聚合

    || |||||||

    ||


                MySSL 安全签章
    Z-BlogPHP