惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
WordPress大学
WordPress大学
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
博客园 - Franky
博客园 - 司徒正美
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
Jina AI
Jina AI
Last Week in AI
Last Week in AI
雷峰网
雷峰网
IT之家
IT之家
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX

ABB00717

SecList Knock Pivoting and Tunneling Broken Authentication File Inclusion Login Brute Forcing Reverse Shell Web Fuzzing HTB - SpeedNet PHP Filter to RCE Redis HTB - Pollution HTB - Pollution 工具 常見服務 HTB - BroScience HTB - BroScience 如何把爛爛的 shell 升級成好用的 TTY 滲透筆記 HTB - Imagery HTB - Imagery HTB - Reset HTB - Reset HTB - Trick HTB - Trick HTB - Editorial HTB - Editorial 150. Evaluate Reverse Polish Notation droopescan 安裝找不到 module imp 解決「桌面背景被當成一個視窗不斷重新彈出並覆蓋其他視窗」的問題
清除 git history 中的機敏資料
2026-06-24 · via ABB00717

在歷史紀錄中定位憑證

在重寫歷史紀錄之前,先找出所有包含機敏資料的 commit。可以用 git log 來找:

git log -p -S "SECRET_STRING"

清理歷史紀錄

有兩種常見的方法來改寫 Git 歷史紀錄。現代標準是 git-filter-repo,但標準的 git filter-branch 在所有 Git 安裝中都可以用。

使用 git filter-branch

Tree filter 允許在每個 commit 的 checkout 過程中執行 shell 腳本。為了防止 git filter-branch 因為警告而停下等待,請設定 FILTER_BRANCH_SQUELCH_WARNING=1 環境變數。

建立一個 bash 腳本來將機密取代為預位符:

!/bin/bash
if [ -f path/to/file ]; then
  sed -i 's/SECRET_STRING/PLACEHOLDER/g' path/to/file
fi

設定可執行:

chmod +x clean.sh

從引入洩漏之 commit 的 parent 開始進行重寫(例如 INTRODUCED_COMMIT~1):

FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --tree-filter /absolute/path/to/clean.sh INTRODUCED_COMMIT~1..HEAD

使用 git-filter-repo

現代工具 git-filter-repogit filter-branch 更安全快速。如果已經安裝,執行簡單的搜尋取代指令即可:

git-filter-repo --replace-text <(echo "SECRET_STRING==>PLACEHOLDER")

這會自動更新儲存庫歷史紀錄中的所有參照。

更新已 checkout 的分支

如果重寫是在臨時分支上進行的,其他分支(像是 master)仍然包含舊的 commit。請藉由將其指標重設為重寫後的 HEAD 來更新它們:

git checkout target-branch
git reset --hard rewritten-branch-or-commit

如果本地端有未 commit 的變更,建議先不要這麼做,因為 hard reset 會捨棄這些變更。

管理鎖定的分支與工作區 (Worktree)

如果 Git 因為分支已在 worktree 中 checkout 而拒絕刪除它,請找出該 worktree:

git worktree list

使用其路徑來移除 worktree:

git worktree remove /path/to/worktree

一旦 worktree 被移除,該分支就會被解鎖,並可以安全地刪除:

git branch -d branch-name

更新遠端儲存庫

如果重寫後的 commit 已經推送到遠端伺服器,標準的 push 會因為歷史紀錄分歧而失敗。必須強制推送以更新伺服器:

git push origin branch-name --force

請通知其他協作者,因為他們需要 fetch 並將其本地分支重設為新的歷史紀錄。