前言

安装 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,防止误删除远程仓库,记录远程仓库地址用于后面还原!
    image.png
  • 还原远程仓库地址
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

qbit
271 声望279 粉丝