默认情况下,当您克隆存储库时,您不会在本地拥有所有远程 refs。即使您清理了本地 git 存储库(使得本地大小实际上更小),您也可能不会在 GitLab 中看到这一点。这是因为(1)默认情况下您没有所有远程参考,并且(2)GitLab 在许多情况下保留了您在本地删除的那些参考。例如,如果您的管道引用了占用空间的不再存在的本地引用,或者合并请求中存在引用等情况。
要解决这个问题,您还需要在遥控器上另外清理这些引用:
-
refs/merge-requests/* 用于合并请求。
-
refs/pipelines/* 用于管道。
-
refs/environments/* 用于环境。
-
refs/keep-around/* 被创建为隐藏引用,以防止删除数据库中引用的提交
如果您将这些引用添加到本地 git 存储库并获取它们,您将看到更接近地反映 GitLab 中报告的大小。
例如,如果您查看您的 git 配置,默认情况下您会看到如下内容:
[remote "origin"]
url = https://gitlab.com/gitlab-org/gitlab-foss.git
fetch = +refs/heads/*:refs/remotes/origin/*
你想编辑你的 git 配置(使用git config -e)并添加上面的引用。例如,添加 merge_requests 引用后,您的 git 配置应如下所示:
[remote "origin"]
url = https://gitlab.com/gitlab-org/gitlab-foss.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*
对每个尚未清理的遥控器执行此操作,获取它们 (git fetch origin),在本地清理它们,然后强制推回遥控器。
但是,有些 refs 没有公布,只能通过导出 GitLab 项目并从导出 tarball(tarball 中的 project.bundle)恢复本地 repo 来检索
git clone --bare --mirror ./project.bundle myrepo
cd myrepo
git filter-repo ... # modify this for your cleanup
git remote remove origin
git remote add origin <project clone URL>
git push origin --force 'refs/heads/*'
git push origin --force 'refs/tags/*'
# push hidden refs
git push origin --force 'refs/replace/*'
完成此操作后,git filter-repo 在./filter-repo/commit-map 创建一个commit-map 文件。获取此文件并将其上传到“设置 -> 存储库 -> 清理”下的存储库清理。
请记住,删除这些也会破坏依赖它们的功能(例如,您将无法查看以前的 MR 中的代码/引用,这些代码/引用在删除引用后发生了更改)。
还知道,在您推送已清理的 refs 并启动 repo 清理后,根据 repo 大小,在 GitLab 中更新大小可能需要 30 分钟或更长时间。
其他参考:GitLab - Reduce repository size
或者,您可以创建一个新的 GitLab 项目并将干净的本地状态推送到新的 GitLab 项目,然后删除旧的。使用这种方法,您当然会丢失 GitLab 存储的大部分历史记录,例如合并请求、设置、CI/CD 管道等。
可以移动新项目以代替旧项目以保留正确的克隆 URL。这是核选项。