私有项目脱离敏感数据通过git rm file肯定是不能够满足这一需求的,git历史记录中还是能够查看被删除的内容的,导致敏感数据的泄露.那么,就必须要彻底删除git的历史记录了.
从仓库总清除文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path-of-remove-file' --prune-empty --tag-name-filter cat -- --all
path-of-remove-file
是你要删除的文件的相对目录(相对于git repo的根目录),可以使用通配符*匹配文件进行批量删除.当看到类似于下面的提示信息说明删除成功了:
Rewrite 59b2e9e1bdc898daa52085648d3a8def767560dc (429/429)
# Ref 'refs/heads/master' was rewritten
如果执行上述命令后出现的提示信息中有unchanged字样,说明repo中没有找到path-of-remove-file,请仔细检查路径和文件名是否正确.
推送修改结果
git push origin master --force #强制覆盖
回收磁盘空间
经过上述操作后,我们已经删除了文件,但是本地仓库中任然保留着这些objects.我们需要使用GC命令进行垃圾回收,彻底清除这些文件,回收磁盘空间.#后面为执行结果,我们可以看见.git目录大小明显缩小了.
rm -rf .git/refs/original/
du -sh .git
# 11M .git
git reflog expire --expire=now --all
git gc --prune=now
#Counting objects: 3370, done.
#Delta compression using up to 4 threads.
#Compressing objects: 100% (2047/2047), done.
#Writing objects: 100% (3370/3370), done.
#Total 3370 (delta 1333), reused 2891 (delta 1108)
du -sh .git/*
#7.5M .git
git gc --aggressive --prune=now
#Counting objects: 3370, done.
#Delta compression using up to 4 threads.
#Compressing objects: 100% (3155/3155), done.
#Writing objects: 100% (3370/3370), done.
#Total 3370 (delta 1419), reused 1944 (delta 0)
du -sh .git
#7.3M .git