如何删除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
2
$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ java -jar bfg-1.12.15.jar --delete-files xxxxx.xx xxxxx.git

Using repo : C:\Users\js\Downloads\xxxxx.git

Found 205 objects to protect
Found 2 commit-pointing refs : HEAD, refs/heads/master

Protected commits
-----------------

These are your protected commits, and so their contents will NOT be altered:

* commit 6c3f4d5a (protected by 'HEAD')

Cleaning
--------

Found 14 commits
Cleaning commits: 100% (14/14)
Cleaning commits completed in 93 ms.

BFG aborting: No refs to update - no dirty commits found??



--
You can rewrite history in Git - don't let Trump do it for real!
Trump's administration has lied consistently, to make people give up on ever
being told the truth. Don't give up: https://github.com/bkeepers/stop-trump
--

我不明白为什么会显示protected commits,在我尝试多次commit之后,也就是修改head~1,或是手动删除文件,都无法让程序成功运行下去。甚至在多次push与pull之后,commit记录竟x2了…

几近崩溃的我只能执行git上取消上一个commit的命令,手动撤销了所有的记录(包括目标记录后的几条commit),再重新提交…Orz

1
2
git reset --hard HEAD~1
git push --force

– 2018.01.05更新 –

又遇到上传错东西的问题了。。

  • java -jar bfg.jar –delete-files xxx.yml zhiliao
  • git rebase -i ‘(此处填写commit id,一长串的那个)’

遇到不让push的时候就强制push

  • git push origin master -f

相关链接: