Git 清理大文件
Summary: Author: 张亚飞 | Read Time: 2 minute read | Published: 2023-03-30
Filed under
—
Categories:
Linux
—
Tags:
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