使用 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

下面详细说明。

一、 安装

  1. 需要本地有 java 环境,本篇不做安装介绍。
  2. 下载 bfg.jar,这里提供的下载连接是 1.14.0,可以自己去官网下载。

二、 基本用法

my-repo.git 是使用 --mirror 克隆到自己本地的代码仓库,执行命令的文件结构如下:

在这里插入图片描述
my-repo.git.bfg-report 记录的是修改的数据。

  1. 下面的命令会将提交历史中大于 500M 的文件都清理掉。
java -jar bfg.jar --strip-blobs-bigger-than 100M my-repo.git
  1. 删除指定文件
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 目录
  1. 删除敏感信息
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]+==>

模拟了一个误将敏感信息上传至远端仓库的操作。

  1. add 提交 test.txtpwd.txt 文件
    在这里插入图片描述
  2. delete 提交将 pwd.txt 文件删除,并删除 test.txt 文件中的 Password1 的值。
    在这里插入图片描述
  3. 执行 bfg 脚本后,再次查看两次提交内容,可发现敏感信息已全部移除。

add 提交中的 Password1 的赋值已经没有了,并且也看不到 pwd.txt 文件的修改了。
add_after
delete 提交已没有修改内容了。
delete_after

四、使用过程中遇到的问题

  1. 需要先用 --mirror 将代码仓库克隆下来,所有的操作都是基于克隆后的代码仓库的。
  2. bfg 不会删除 git 仓库的文件,即使使用 --delete-files 进行删除。正确的做法应该是手动删除文件后,提交到远端仓库,bfg 仅删除提交历史中相关的数据。
  3. 最后 git push 的时候总是报权限不足(我自己创建的代码仓库),那么需要添加 --no-blob-protection 参数。这里有些权限控制还没太清楚了,实在不行,可以先将分支/tag 的保护放开,更新完成之后再设回原来的。在这里插入图片描述
    这里给个分支不允许强制推动的例子,将图中的按钮开关关闭,再推送会报错。
  4. --replace-text 参数需提供一个替换样本,一行就是一个替换样本。替换的是全仓库数据,会去扫描仓库。
  5. devmain 分支,同时都包含了一些需要去除敏感信息的提交历史,会怎么做?因为 clone 命令使用了 --mirror 标志,所以此推送将更新远程服务器上的所有引用,即:devmain 分支,包扩所有的 tag 的提交记录都会删除。
  6. 不会删除提交记录,只是将记录中的数据修改移除。

bfg 主要用途:希望保留提交历史,需删除提交历史记录中的不希望被其他人看到的信息(密钥,个人隐私等)或大文件的移除。
环境配置完成后,使用还是比较方便的,软件运行速度也非常快,当遇到类似需求时推荐使用。

最后还是祝愿大家不要用到这个工具,尽量提前做好相应的知识储备(git 的使用,敏感信息过滤等),以防出现不必要的麻烦。

有时候我们提交代码到GitHub/Giglab平台, 发现一不小心把带有账号密码以及服务器地址的代码等敏感信息提交到公共平台,对于这种情况我们应该使用一些方案进行规避。下面就讨论下这些方案! Git 提供了多种方式来清除已提交的内容,但这通常需要对 Git 有一定的理解,并且清除已提交的内容可能会对你的仓库和其他协作者产生影响。请注意,在推送到远程仓库之后使用以上命令来清除已提交的内容需要谨慎,因为这可能会影响其他协作者。如果你已经推送了你的提交,最好与你的团队协商后再决定如何清除已提交的内容。这个命令会创建一个新的提交,这个新的提交会撤销指定的提交。这个命令不会改变你的提交历史,只会添加一个新的提交。但是这个命令比较复杂,并且可能会对你的提交历史造成不可逆的影响。 1. 前言正常Git仓库应该尽量不包含数据库连接/AWS帐号/巨大二进制文件,否则一旦泄漏到Github,这些非常敏感信息会影响客户的信息安全已经公司的信誉。公司可能其... git清理历史大文件 之前写过一篇的,使用git命令清理的大文件,但是我3G多的git,.git文件夹里面的pack就3G多,而且是个好几年并且在持续开发的项目,里面的提交成千上万了,每次使用git filter-branch,都要好几个小时,我研究了一下,要彻底清理项目的那一堆大文件,只要要用脚本连续跑两天。。。 最近发现了一个方案,使用bfg,我仅仅十几分钟就处理完了 原先的方案:https://blog.csdn.net/qq_36254947/a 你可能接触过 git-filter-branch 来清理 git 仓库,不过同时也能体会到这个命令使用的繁琐,以及其超长的执行时间。 现在,你可以考虑使用 bfg 来解决问题了! 本文内容安装 bfg传统方式安装(不推荐)使用包管理器 scoop 安装准备工作常见用法删除误上传的大文件删除特定的一个或多个文件删除文件删除敏感的密码信息推回远端仓库附命令行用法输出 安装 bfg 传统方式安装(不... Github sourcegraph sourcegraph介绍 sourcegraph 是Google浏览器强大的Github插件,类似与在线的IDE,可以在在github网站搜索,查看,编译代码等。 2、GitZip 必须火狐打开 为什么GitZip :-你不需要下载整个项目只是为了那几个文件/dirs你需要。 在任何GitHub公共repos页面。 只要双击你需要的项目。 点击右下角的下载按钮。 查看进度面板并等待浏览器触发器下载。 当日常代码提交时,不小心把敏感信息提交上去后,再进行删除操作,虽然文件在代码删除,但还是可通过提交历史查看到敏感信息。 例如在历史很久之前的某一次提交,把敏感信息(账号密码等)提交上去。 发现后立马修改源代码,将里边的敏感信息删除删除后查看该文件历史操作记录,包含敏感信息历史commit仍存在,点击还是可查看到敏感信息。 为了不让敏感信息泄露,可通过以下方法清除隐患。 1. 删除指定文件或目录,提交 git filter-branch --tree-filter 'rm -r 这是您可以在执行提交之后并推送到原始位置之前清理本地git repo的方法。 前期工作 1.下载BFG.jar https://rtyley.github.io/bfg-repo-cleaner/ https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar 2.创建目录结构 mkdir - p ~/.binari... 当我们添加git数据到远程上,确发现我们配置文件有秘密数据,提交以后别人就可以看到你提交的数据信息,并且就算把秘密去除在新的版本上也可以看到之前提交的数据与当前有那些不同,很显然这样的事情我们应该挽救,把之前历史提交删除掉,保证数据不泄露,简单三步骤. 查看提交的历史记录,把要删除的的日志前面把改成 更改完成后,使用vim命令进行保存 查看历史记录已经删除了,大功告成! 当你想要从你的git repo删除大量文件做过滤的时候,你第一个会想到的是git filter-branch,但是这个使用不方便加上速度不快,幸好我们迎来了killer工具 - bfg. 他不会真正的把这些文件从最新的commit删除。下面是具体步骤:首先你需要以--mirror的方式来git clone你的仓库 git clone --mirror git://example.com/you... 通过bfg.jar工具,永久删除git里的大文件。 工具位置 https://rtyley.github.io/bfg-repo-cleaner/,使用也很简单。 $ git clone --mirror git://example.com/some-big-repo.git $ java -jar bfg.jar --strip-blobs-bigger-than 100M some... 对 Git 仓库的维护通常是为了减少仓库的大小。如果你从另外一个版本控制系统导入了一个仓库,你可能需要在导入后清除掉不必要的文件。本文主要讨论如何从 Git 仓库删除不需要的文件。请格外小心.....本文的步骤和工具使用的高级技术涉及破坏性操作。确保您在开始之前仔细读过并备份了你的仓库,创建一个备份最容易的方式是使用 --mirror 标志对你的仓库克隆,然后对整个克隆的文件进行打包压缩。有了... 3. 执行命令:git rebase -i 记录ID 4. 进入到一个页面。 5. 使用cw命令将行首的pick替换为drop(注意每完成一个替换操作,需要按下Esc键退出vi的编辑模式)。 6. 检查确认后,按wq保存并退出