前言
- 有些历史目录并没有保留回退的必要,反而占了很多的资源,需要清理
- 搜到到两个主流工具:BFG Repo-Cleaner 和 git filter-repo
- git filter-repo 被 git 官方推荐,下文用
git filter-repo
举例
安装 git filter-repo
pipx install git-filter-repo
查找大文件
- 查找大文件,包括已删除的文件
git filter-repo --analyze
- 上述命令会在 .git/filter-repo/analysis 目录下生成一些分析文件
- 文件列表示例
blob-shas-and-paths.txt
directories-all-sizes.txt
directories-deleted-sizes.txt
extensions-all-sizes.txt
extensions-deleted-sizes.txt
path-all-sizes.txt
path-deleted-sizes.txt
README
renames.txt
- 打开
path-all-sizes.txt
查看大文件
清理过程
- 命令行进入本地 git 仓库目录
- 移除
lib20241231
目录
# --invert-paths 相当于 delete 参数
# 默认无 invert-paths 是保留路径
# 加 invert-paths 反转为删除路径
git filter-repo --path lib20241231 --invert-paths
- 注意:git-filter-repo 会移除掉 git 配置文件中的 origin,防止误删除远程仓库,记录远程仓库地址用于后面还原!
- 还原远程仓库地址
git remote add origin <repo-url-here>
- 推送
git push --all --force && git push --tags --force
- 这时可以重新
clone
仓库,验证仓库大小。
qbit 尝试时,gitea 上面显示的体积没有减小,但重新 clone 后检查仓库体积是减小了的。
gitea 更新仓库体积可能有自己的规则。
检查清理是否生效
- 使用
git count-objects -vH
查看仓库大小 - 使用
git log
查看提交历史
# 如果没有任何输出,说明该路径下的文件或目录已不再存在于任何提交中。
# 如果有输出,则表示还有提交包含该路径。
# 双短横 -- 是用来分隔命令选项和路径参数的
git log -- lib20241231
- 使用
git filter-repo --analyze
命令分析
这会在 .git/filter-repo/analysis 目录下生成一些分析文件
所有目录,包括普通删除的目录,会出现在 directories-all-sizes.txt 文件里面
所有普通删除的目录,会出现在 directories-deleted-sizes.txt 文件里面
通过 git filter-repo 删除的目录,不会出现在上面两个文件里面
后记
- 在 git 服务端查找仓库目录时,注意所有字母要小写,比如仓库名为
AbcDef
,仓库目录名会是abcdef.git
切换分支后清理,可能会报以下警告,然后中止执行
Aborting: Refusing to destructively overwrite repo history since this does not look like a fresh clone. (expected at most one entry in the reflog for HEAD) Please operate on a fresh clone instead. If you want to proceed anyway, use --force.
本文出自 qbit snap
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。