Git 清理大文件

Summary: Author: 张亚飞 | Read Time: 2 minute read | Published: 2023-03-30
Filed under Categories: LinuxTags: Note,

清理大文件 - 使用 git-filter-repo 推荐

brew install git-filter-repo

列出所有大于 100M 的文件

git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {if ($3 > 100000000) print substr($0,53)}' | sort -k5 -n -r
790 docker/tools/resourses/go1.19.13.linux-amd64.tar.gz
620 docker/tools/resourses/clickhouse-common-static-23.9.1.1854-arm64.tgz
382 docker/tools/resourses/clickhouse-common-static-23.9.1.1854-amd64.tgz

查看仓库大小

git count-objects -v

依次清理大文件

git filter-repo --path docker/tools/resourses/clickhouse-common-static-23.9.1.1854-arm64.tgz --invert-paths
git filter-repo --path docker/tools/resourses/clickhouse-common-static-23.9.1.1854-amd64.tgz --invert-paths
git filter-repo --path docs/tools/resourses/clickhouse-common-static-23.9.1.1854-arm64.tgz --invert-paths
git filter-repo --path docker/tools/resourses/go1.19.13.linux-amd64.tar.gz --invert-paths
git filter-repo --path docs/tools/resourses/go1.19.13.linux-amd64.tar.gz --invert-paths
git filter-repo --path docs/tools/resourses/clickhouse-common-static-23.9.1.1854-amd64.tgz --invert-paths

清理并推送

git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --force

删除误上传的大文件 - 使用 bfg

brew install bfg

使用下面的命令,可以将仓库历史中大于 500M 的文件都删除掉。

bfg --strip-blobs-bigger-than 500M

删除特定的一个或多个文件

删除指定文件:

bfg --delete-files docker/tools/resourses/clickhouse-common-static-23.9.1.1854-arm64.tgz
bfg --delete-files docker/tools/resourses/clickhouse-common-static-23.9.1.1854-amd64.tgz
bfg --delete-files docker/tools/resourses/go1.19.13.linux-amd64.tar.gz

bfg 不支持指定路径,以上操作会报错,如果执行 bfg --delete-files clickhouse-common-static-23.9.1.1854-arm64.tgz 又会把仓库下所有名为 clickhouse-common-static-23.9.1.1854-arm64.tgz 的文件都删掉。

可以使用以下命令先找出该文件的 Git 对象 ID

$ git rev-list --objects --all | grep "clickhouse-common-static-23.9.1.1854-arm64.tgz"
d1fc9a5ec2d01d036a391218a40185f23a26a0f8 docker/tools/resourses/clickhouse-common-static-23.9.1.1854-arm64.tgz

再通过以下命令删除

git filter-repo --blob-callback 'if blob.oid==b"d1fc9a5ec2d01d036a391218a40185f23a26a0f8": blob.skip()'
bfg --delete-files {walterlv,lindexi}.snk
bfg --delete-folders walterlv

此命令可以与上面的 –delete-files 放在一起执行:

bfg --delete-folders walterlv --delete-files walterlv.snk

删除敏感的密码信息

bfg --replace-text expression-file.txt

下面这个例子示例将 git 仓库中所有文件中的 密码:123456 字符串替换成 REMOVED

密码:123456

更复杂一点的,下面的例子示例将 git 仓库中所有文件中的 密码:123456 字符串替换成 密码:******:

密码:123456 ==> 密码:******

还可以使用正则表达式:

regex:密码:\d+ ==> 密码:******

最后,有一个不必要的操作。就是回收已经没有引用的旧提交,这可以减小本地仓库的大小:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Comments

Cor-Ethan, the beverage → www.iirii.com