【Step1】先备份你要清理的文件
【Step2】切换到需要操作的分支,清除历史记录中待删除的文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch [path-to-your-remove-file]' --prune-empty --tag-name-filter cat -- --all
其中,[path-to-your-remove-file] 就是你要删除的文件的相对路径(相对于git仓库的根目录),替换成你要删除的文件即可。
注意一点,这里的文件或文件夹,都不能以 '/' 开头,否则文件或文件夹会被认为是从 git 的安装目录开始。如果你要删除的目标不是文件,而是文件夹,那么请在
git rm --cached' 命令后面添加 -r 命令,表示递归的删除(子)文件夹和文件夹下的文件,类似于 'rm -rf 命令。
如果你看到类似下面这样的,就说明删除成功了:
Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
# Ref 'refs/heads/master' was rewritten
【Step3】推送我们修改后的repo
git push origin [分支名] --force
【注】
如果 push 的是保护分支,会报权限错误。先去除保护后,再执行。
【Step4】新建脱敏后的配置文件,git add & git commit 提交
【Step5】清理 tag 中的历史记录
【warning】
操作前,一定记得手动备份下原有 tag 的 log、描述等信息!
git tag # 查看 tag 列表
git checkout -b tag1 v1.0.0 # 检出该 tag v1.0.0 到分支 tag1
git tag -d v1.0.0 # 删除 tag v1.0.0
git push origin :refs/tags/v1.0.0 # 推送远程
git tag v1.0.0 # 新建 tag
git push origin v1.0.0 # 推送远程
git checkout master # 切换到主分支
git branch -d tag1 # 删除临时分支 tag1
【Step6】清理和回收空间
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
可对比操作前后 .git 文件夹大小,变小说明操作成功~\(^o^)/
网友评论