如何删除GitHub的历史commit
这可能是目前互联网上最详细的BFG Repo-Cleaner中文教程了。
为了删除三天前的一次错误提交,我开始寻找关于撤销github历史commit的方法。
实话说,经历了6个小时的搜索,我依旧没有找到能解决我所碰到的奇怪问题的解决方案,我发现网络上对于BFG的相关讨论太少太少,尤其是中文的信息,更是贫瘠。另外的原因也是大部分人确实能按照官方的指引,一步到位地删除历史提交的信息。我失败了,不知道是因为git配置或是哪出了纰漏,但也因此浏览了互联网上大部分解答。
以下是我整理出的使用教程。
BFG Repo-Cleaner
github称BFG为
git filter-branch
的替代品。一款比它更快更简单的用于删除无用数据的工具。
作为一个github官方推荐的”仓库清理工具”,快速和简单是它被推荐的重要原因,程序为一个Scala
编写而成的jar包,也意味着运行环境需要jdk的支持。
ok,竟然github都这样推荐了,就先来试一试。
BFG的主要功能与使用步骤如下:
1.克隆仓库
1 | git clone --mirror git://example.com/some-big-repo.git |
使用--mirror
标记clone一份repo(目标仓库)到本地。
2.执行BFG命令移除文件
1 | java -jar 占位符1 占位符2 占位符3 |
clone下来的git仓库和你想象中应该是有点差距的,因为它和你托管在github上的仓库并不一样,它并没有你编写的代码和文件结构,但它与你的库相关联。你可以选择备份也可以选择直接操作。
占位符1:
- jar包路径,若刚好位于bash的当前目录,则直接输入jar包文件名 例:bfg-1.12.15.jar
占位符2:
--strip-blobs-bigger-than 10M
删除所有大于10m的文件--delete-files id_{dsa,rsa}
删除id_dsa, id_rsa--delete-files file
删除目标文件--replace-text passwords.txt
txt定义语法替换文件内容--delete-folders folder
删除文件夹
占位符3:
- clone下来的git文件名 例:some-big-repo.git
e.g.
1 | java -jar bfg.jar --strip-blobs-bigger-than 10M some-big-repo.git |
3.使用gc命令删除目标数据
1 | cd some-big-repo.git |
4.提交修改
1 | git push |
至此,新clone出来的git库中,将再也找不到被删除的内容了。
相关参考链接请移步页脚。
以下记录我遇到的问题
执行命令
1 | java -jar bfg-1.12.15.jar --delete-files carousel.jsp tmall-web-store.git |
报错信息:These are your protected commits, and so their contents will NOT be altered: commit 6c3f4d5a (protected by ‘HEAD’)
1 | java -jar bfg-1.12.15.jar --delete-files xxxxx.xx xxxxx.git |
我不明白为什么会显示protected commits,在我尝试多次commit之后,也就是修改head~1,或是手动删除文件,都无法让程序成功运行下去。甚至在多次push与pull之后,commit记录竟x2了…
几近崩溃的我只能执行git上取消上一个commit的命令,手动撤销了所有的记录(包括目标记录后的几条commit),再重新提交…Orz
1 | git reset --hard HEAD~1 |
– 2018.01.05更新 –
又遇到上传错东西的问题了。。
- java -jar bfg.jar –delete-files xxx.yml zhiliao
- git rebase -i ‘(此处填写commit id,一长串的那个)’
遇到不让push的时候就强制push
- git push origin master -f
相关链接: