如何清理长期运营的超大体积Git仓库的历史记录以缩减仓库大小?
Git仓库截断2021年1月1日之前历史的操作方案
注意:操作前请完整备份整个Git仓库目录,避免操作失误导致数据丢失。如果是团队协作仓库,操作完成后所有协作者必须删除本地旧仓库,重新拉取新的远程仓库,否则会出现历史冲突。
前置准备
- 安装
git-filter-repo工具:这是Git官方推荐的历史修改工具,替代老旧的git filter-branch,可通过系统包管理器或pip install git-filter-repo安装。 - 确认你要保留的最早提交时间:本次需求为保留2021年1月1日0点之后的所有提交。
操作步骤
- 进入本地仓库根目录,先清理当前工作区,确保没有未提交的修改:
git status # 确认所有修改已提交或暂存,否则先执行commit/stash
- 执行历史截断命令,自动过滤所有2021年1月1日之前的提交:
git filter-repo --commit-callback ' if commit.author_date < b"2021-01-01 00:00:00 +0000": commit.skip() '
如果你的仓库提交时区不是UTC,可把上面的
+0000换成对应时区,比如东八区用+0800。
- 验证截断结果:执行
git log --oneline查看提交历史,确认最早的提交是2021年1月1日之后的内容,同时检查仓库内的文件是否完整。 - 执行垃圾回收进一步缩小仓库体积:
git gc --prune=now --aggressive
- 推送到远程仓库(如果需要同步到远端):
git push origin --force --all # 如果需要同步标签,额外执行 git push origin --force --tags
常见问题处理
- 如果执行
git filter-repo时报错提示仓库不是全新的,可先把当前仓库克隆一份裸仓再操作,命令为git clone --bare 原仓库路径 新裸仓路径,进入裸仓目录执行上述截断命令后,再重新克隆回普通仓库即可。 - 如果只想保留单个分支的历史,可在
git filter-repo命令后追加--refs 分支名参数,仅处理指定分支。
内容的提问来源于stack exchange,提问作者krave
相关产品推荐
相关产品推荐

