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