删除误传的带密码和令牌的配置文件,或者是占用空间的大文件[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 |