Git上传了秘钥如何彻底修改包括历史记录【从安装到实战详细版】
使用 BFG Repo-Cleaner 清除 Git 仓库中的敏感信息
1. 背景介绍
在使用 Git 进行版本控制时,有时会不小心将敏感信息(如 API 密钥、密码等)提交到仓库中。即使后续删除,这些信息仍然存在于 Git 的历史记录中。本文将介绍如何使用 BFG Repo-Cleaner 工具彻底清除这些敏感信息。
2. 准备工作
2.1 环境要求
- Java 运行环境(JRE 8 或更高版本)
- Git 客户端
- 需要清理的 Git 仓库
2.2 下载 BFG
- 访问 BFG 官方下载页面:https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/
- 下载
bfg-1.13.0.jar
文件 - 将下载的 jar 文件放在你的项目父目录下
3. 使用步骤
- 我的yml 文件
mybatis:
mapper-locations: classpath:mappers/*xml
type-aliases-package: cn.yam.mcp.entity
server:
port: 9091
spring:
datasource:
url: jdbc:mysql://localhost:3306/mcp-test-db
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
deepseek:
api-key: sk-1234
logging:
level:
root: INFO # 全局日志级别
# org.springframework: DEBUG # Spring 框架的日志
# org.springframework.web: DEBUG # Spring Web 的日志
# org.springframework.jdbc: DEBUG # Spring JDBC 的日志
3.1 创建替换规则文件
- 在项目父目录下创建
secrets.txt
文件 - 添加替换规则,例如:
regex:sk-[a-zA-Z0-9]{32}==>***REMOVED***
regex:api-key:.*==>api-key: ***REMOVED***
这里的规则说明:
- 第一行匹配形如
sk-
开头的 32 位字符的 API 密钥 - 第二行匹配整个 api-key 配置行
3.2 目录结构示例
spring4test_proj/
├── bfg-1.13.0.jar
├── secrets.txt
└── Spring-MCP-starter/ # 你的 Git 仓库
3.3 执行清理命令
在项目父目录下执行:
java -jar bfg-1.13.0.jar --replace-text secrets.txt Spring-MCP-starter --no-blob-protection
参数说明:
--replace-text secrets.txt
: 指定替换规则文件Spring-MCP-starter
: 指定要清理的仓库目录--no-blob-protection
: 允许修改最新的提交
3.4 清理和更新
进入仓库目录,执行:
cd Spring-MCP-starter
git reflog expire --expire=now --all && git gc --prune=now --aggressive
3.5 推送更改
git push origin --force --all
4. 注意事项
- 在执行清理前,确保已备份重要数据
- 使用
--force
推送会重写远程仓库的历史,团队其他成员需要重新克隆仓库 - 清理后要立即修改已泄露的密钥
- 建议在
.gitignore
中添加包含敏感信息的文件 - 考虑使用环境变量或配置管理工具来管理敏感信息
5. 最佳实践
-
使用配置模板文件
# application.yml.template deepseek: api-key: ${DEEPSEEK_API_KEY}
-
在
.gitignore
中添加application.yml
-
使用环境变量或专门的配置管理工具存储敏感信息
参考资料
- BFG Repo-Cleaner 官方文档
- Git 文档