使用 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/*xmltype-aliases-package: cn.yam.mcp.entity
server:port: 9091
spring:datasource:url: jdbc:mysql://localhost:3306/mcp-test-dbusername: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driverdeepseek:api-key: sk-1234logging: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 文檔