git彻底删除提交历史

2017-07-07  本文已影响1300人  猴子精h

git为我们提供了"后悔药", 但有时候我们会将一些敏感数据提交至git仓库,虽然使用了git rm删除文件,但是文件仍然存在在提交历史中。git提供了两个工具给我们去彻底删除提交历史的方法。

做以下操作时切记先备份gitlab服务器

git filter-branch

  1. git clone项目到本地

  2. 使用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
    
  3. 确认无误后,提交至版本库(切记,下面的操作将不可逆)

    git push origin --force --all
    git push origin --force --tags
    
  4. 操作完成后,需要通知小伙伴们重新clone代码,因为提交历史被修改了,远程仓库很可能会与本地仓库冲突

    所以在维护时,应该提醒大家先把代码全部提交,带清理完后,然小伙伴们重新clone使用。

BFG Repo-Cleaner

git官方也推荐使用这个工具,且处理速度要比git filter-branch快上很多。

参考

上一篇下一篇

猜你喜欢

热点阅读