前言
使用
Git
的过程中,我们有可能会误提交一些敏感信息(密钥,个人隐私)或无用文件等到远程仓库。这时我们需要清理相关的数据,直接在文件中删除敏感信息再提交,虽然仓库中没有了敏感信息,但是在提交历史中还是能看到相应的敏感信息。
当我们需要从提交记录中删除这些敏感信息,又不希望整个仓库的提交记录丢失时,可以使用官方 git-filter-branch 工具,但是使用起来麻烦而且速度也不快。
这里推荐使用 BFG Repo-Cleaner 工具,它是
Scala
编写的,专门针对移除
git
提交记录而制作的,是
git-filter-branch
的替代品,官方介绍说要比
git-filter-branch
快上
10~720
倍。
BFG Repo-Cleaner 的使用
官网流程介绍:
git clone --mirror git://example.com/some-big-repo.git
java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all &&git gc --prune=now --aggressive
git push
下面详细说明。
一、 安装
- 需要本地有
java
环境,本篇不做安装介绍。 - 下载
bfg.jar
,这里提供的下载连接是 1.14.0,可以自己去官网下载。
二、 基本用法
my-repo.git
是使用
--mirror
克隆到自己本地的代码仓库,执行命令的文件结构如下:
my-repo.git.bfg-report
记录的是修改的数据。
- 下面的命令会将提交历史中大于
500M
的文件都清理掉。
java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git
- 删除指定文件
java -jar bfg.jar --delete-files id_dsa my-repo.git // 删除 id_dsa 文件
java -jar bfg.jar --delete-files id_{dsa,rsa} my-repo.git // 文件名为 `id_dsa` 和 `id_rsa` 的文件都会删除
- 删除目录
java -jar bfg.jar --delete-folders pwd my-repo.git // 删除 pwd 目录
- 删除敏感信息
java -jar bfg.jar --replace-text replace_pwd.txt my-repo.git
这里的
replace_pwd.txt
是我们自己定义需要移除数据的文本,具体的语法规则自行学习使用,示例如下:
PASSWORD1 # 默认删除 PASSWORD1 的相关记录
PASSWORD2==>examplePass # PASSWORD2 改为 examplePass
PASSWORD3==> # PASSWORD3 转为 空字符串
regex:password=\w+==>password= # 正则匹配替换,将password具体的数据删除 password=xxx 替换为 password=
regex:\r(\n)==>$1 # 替换 Windows 换行符 为 Unix 换行符
三、 示例
bfg
脚本
# 先使用 `--mirror` 将数据库克隆下来, `git --mirror` 的作用,感兴趣的可以自己去搜索。git clone --mirror xxx/my-repo.git
# 替换 Password1:xxx 为空
java -jar bfg.jar --replace-text "replace_pwd.txt" --no-blob-protection my-repo.git
# 删除 pwd.txt 文件
java -jar bfg.jar --delete-files "pwd.txt" --no-blob-protection my-repo.git
cd my-repo.git
# 清理脏数据git reflog expire --expire=now --all &&git gc --prune=now --aggressive
# 推送至远端git push
replace_pwd.txt
文件内容
regex:Password1:[\s\S]+==>
模拟了一个误将敏感信息上传至远端仓库的操作。
add
提交test.txt
和pwd.txt
文件delete
提交将pwd.txt
文件删除,并删除test.txt
文件中的Password1
的值。- 执行
bfg
脚本后,再次查看两次提交内容,可发现敏感信息已全部移除。
add
提交中的
Password1
的赋值已经没有了,并且也看不到
pwd.txt
文件的修改了。
delete
提交已没有修改内容了。
四、使用过程中遇到的问题
- 需要先用
--mirror
将代码仓库克隆下来,所有的操作都是基于克隆后的代码仓库的。 bfg
不会删除git
仓库的文件,即使使用--delete-files
进行删除。正确的做法应该是手动删除文件后,提交到远端仓库,bfg
仅删除提交历史中相关的数据。- 最后
git push
的时候总是报权限不足(我自己创建的代码仓库),那么需要添加--no-blob-protection
参数。这里有些权限控制还没太清楚了,实在不行,可以先将分支/tag
的保护放开,更新完成之后再设回原来的。 这里给个分支不允许强制推动的例子,将图中的按钮开关关闭,再推送会报错。 --replace-text
参数需提供一个替换样本,一行就是一个替换样本。替换的是全仓库数据,会去扫描仓库。- 有
dev
和main
分支,同时都包含了一些需要去除敏感信息的提交历史,会怎么做?因为clone
命令使用了--mirror
标志,所以此推送将更新远程服务器上的所有引用,即:dev
和main
分支,包扩所有的tag
的提交记录都会删除。 - 不会删除提交记录,只是将记录中的数据修改移除。
总结
bfg
主要用途:希望保留提交历史,需删除提交历史记录中的不希望被其他人看到的信息(密钥,个人隐私等)或大文件的移除。
环境配置完成后,使用还是比较方便的,软件运行速度也非常快,当遇到类似需求时推荐使用。
最后还是祝愿大家不要用到这个工具,尽量提前做好相应的知识储备(
git
的使用,敏感信息过滤等),以防出现不必要的麻烦。
参考
- git bfg 官方介绍
- git-filter-branch 官网介绍
- 【GIT技巧】清除历史提交记录中的敏感信息
版权归原作者 Grassto 所有, 如有侵权,请联系我们删除。