删除误传的带密码和令牌的配置文件,或者是占用空间的大文件[1][2]

# 安装 git-filter-repo

pipx install git-filter-repo

# 找出文件并删除

对于知道路径的单个文件,比如 .env

git filter-repo --force --invert-paths .env

就会移除整个库中所有提交记录包含该文件的内容。

对于任意的文件,比如按照文件大小升序排列并取最后 40 个文件[3]

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -40 | awk '{print$1}')"

也可以拆开逐个寻找文件:

git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -40
git rev-list --objects --all | grep 文件对应的id

找到要删除的文件名,替换上述 .env 即可。

指定 --path-regex 选项可以正则匹配,比如 .+\.csv 是匹配所有 CSV 文件:

git filter-repo --force --invert-paths --path-regex .+\.csv

但是使用 git-filter-repo 后会清空 .git/config 中远端仓库的地址,可能还得重新添加:

git remote add origin git@github.com:user/repo.git

推送到远端分支

git push -f origin master

推送到远端所有分支

git push origin --force --all

推送到远端所有 tag

git push origin --force --tags

  1. 用 git filter-repo 彻底删除 Git 中的大文件 ↩︎

  2. Removing sensitive data from a repository ↩︎

  3. Git 如何永久删除文件 (包括历史记录) ↩︎