git为我们提供了"后悔药", 但有时候我们会将一些敏感数据提交至git仓库,虽然使用了git rm
删除文件,但是文件仍然存在在提交历史中。git提供了两个工具给我们去彻底删除提交历史的方法。
做以下操作时切记先备份gitlab服务器
git filter-branch
-
git clone项目到本地
-
使用git filter-branch命令移除版本库中的信息, 并重写commit记录。
# 这里演示了删除一个文件, 将FILENAME替换为文件名,多个以空格分隔, 可以用*匹配目录。 git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch FILENAME' --prune-empty --tag-name-filter cat -- --all # 还可以直接整个test文件夹 git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch test' --prune-empty --tag-name-filter cat -- --all
(可选) 执行完成后,归档历史已经清理完成,但还有一些垃圾文件,用下面的命令清理
rm -rf .git/refs/original/ git reflog expire --expire=now --all git gc --prune=now git gc --aggressive --prune=now
-
确认无误后,提交至版本库(切记,下面的操作将不可逆)
git push origin --force --all git push origin --force --tags
-
操作完成后,需要通知小伙伴们重新clone代码,因为提交历史被修改了,远程仓库很可能会与本地仓库冲突
所以在维护时,应该提醒大家先把代码全部提交,带清理完后,然小伙伴们重新
clone
使用。
BFG Repo-Cleaner
git官方也推荐使用这个工具,且处理速度要比git filter-branch快上很多。
网友评论