本文介绍代码库容量限制,如何清理代码库容量,以及代码库的大文件(二进制文件)如何管理和清理。
1. 代码库存储空间容量是否有限制?
企业代码库数量不限,默认单个代码库 10GB 空间,包括 5GB Git 容量和 5GB 大文件存储(Git LFS)空间。
当代码库容量满后,企业管理者可以选择「升级企业套餐」以获取更多容量,参见云效基础功能和高级版专属功能说明:
什么是大文件存储 Git LFS 容量?Codeup Git LFS 功能简介
2. 如何清理代码库容量?
为了保证平台资源不被恶意滥用,同时保障每位用户流畅的使用体验,推荐单个代码库保持 Git 数据保持在 5GB 以内,二进制大文件请使用Git LFS大文件存储管理。
单个代码库容量即将到达推荐阈值时,需要自行进行容量清理,强烈建议二进制文件切换为 LFS 存储,提升代码推拉速度,切换后不影响日常使用流程。
购买资源包或升级高级版可获取更多代码库容量:云效 2020 资费
容量未达上限
为了不影响你的日常研发工作,当容量达到存储限额的 90% 时,针对本地推送行为平台将发起提醒,建议开发者及时进行仓库容量清理,当容量超过上限后将禁止写操作,届时将无法删除文件:
文件清理
作为开发者,请及时删除不需要的文件,释放仓库容量。
GC 清理
作为代码库管理员,点击库设置-基本设置,可以在代码库接近存储限制时使用库 GC 功能,压缩存储库对象,减少磁盘占用,提升读写仓库的效率。
LFS 空间清理
使用 LFS 管理二进制文件,当删除 Git 源文件时,LFS 资源文件不会连带删除,仍然占用 LFS 存储空间,需要手动对 LFS 资源文件进行清理。
库管理员点击代码库设置,可见大文件存储菜单,勾选期望删除的文件后进行删除:
通过以下命令,可查看当前仓库正在关联的 LFS 资源文件,然后根据实际需要,按需删除此列表外的 LFS 资源文件。
git-lfs-ls-files(1)
Show information about Git LFS files in the index and working tree.
容量已达上限
当达到推荐容量上限后,平台将暂时锁定仓库的写操作权限,此时仅允许在库设置中进行库容量 GC 优化。
你可以购买资源包或升级为高级版企业,对应容量说明参见云效 2020 资费。为了不影响日常工作,建议尽快处理:
企业管理员在企业管理后台可确认是否已成功购买资源包或升级套餐,见下图套餐信息标识:
3.代码库中 Git 大文件如何清理?
如果在代码库中提交了大量的二进制文件,可能导致代码库容量超出限制而无法写入,或者单个文件过大,超出单文件大小限制而无法写入。
此时建议对已提交代码库的历史大文件进行清理,然后将大文件使用 Git-LFS 进行存储管理,Git 大文件转 LFS 管理参见LFS 迁移指南。
数据备份
清理操作会改写代码库提交历史,清除历史的大文件,建议将远程代码库克隆下来,先在本地进行备份。
工具安装
清理仓库大文件需要修改仓库的提交历史,git-filter-repo 是 Git 官方社区推荐的修改仓库提交历史的工具,本文介绍使用 git-filter-repo 来清理仓库大文件的方法。
安装方法参考git-filter-repo 安装说明,或直接使用下述命令安装:
pip3 install git-filter-repo
克隆裸库
从 Codeup 上克隆待处理的代码库裸库,以 HTTP 协议为例:
git clone --mirror --bare HTTPs://codeup.aliyun.com/example/example.git
清理大文件
进入克隆好的裸库中
cd example.git
git-filter-repo 支持三种方式的大文件清理:按照文件大小、路径或者按照文件 blob ID,具体可以参考官方使用说明,以下通过示例详细说明其使用方法。
按文件大小清理
假如要清理大于 100M 以上的文件,执行下述命令:
git filter-repo --strip-blobs-bigger-than 100M
--strip-blobs-bigger-than 参数支持K、M和G三种单位,比如这儿的100M也可以换成10K,1G等。
按文件路径清理
假如已知大文件的路径,可以通过组合 --path 和 --invert-paths 参数来清理相关大文件。例如,要从仓库的提交历史中删除 path/of/large/file.lib 文件和 bin/ 目录,可以执行下述命令:
git filter-repo --path path/of/large/file.lib --path /bin/ --invert-paths
这两个参数组合起来可保留除了--path 指定的目录/文件外的其他所有文件/目录,即从仓库历史提交中清除 --path 指定的所有目录/文件。
按文件 blob ID 清理
假如已知大文件的 blob ID,可以将大文件的 blob ID写入一个文件中,比如在文件 ids.txt 中写入下述几个大文件 blob ID
e152814d14939a20f5399acf80b606ad018f872a
b747204ba81985a3f41314ef55d4c4a24868ede2
然后执行
git filter-repo --strip-blobs-with-ids ids.txt
更新服务端仓库
首先更新 example.git 仓库配置,在 example.git 中执行下述命令
git config remote.origin.mirror false
使用本地去除大文件后的仓库强制更新远程仓库
git push -u origin refs/heads/*:refs/heads/* -f
git push -u origin refs/tags/*:refs/tags/* -f
查看远端更新效果
在 Codeup 页面上确认对应代码库的相关大文件已经从各个分支的提交历史中被清除。
仓库立即清理
执行完上述操作后,由于清理存在等待周期,服务端仓库大小此时可能并没有明显变化。
如需立即生效,需要仓库管理员在仓库的“设置”中点击“立即清理”,并选择“立即删除”,执行完清理操作后相关大文件将从服务端仓库中彻底清除。
更多场景的大文件清理方法
通过 Agit-Flow 推送评审模式提交代码,源提交可能也携带了大文件,其清理方式参见如何清理 Agit 集中式评审引入的大文件空间?