3. 誤推的處理方法
刪除已push資料
如果你不小心把 node_modules/、.env 隱私設定檔,或個人測試檔案推上去了,但本地電腦還需要用到它,可以用這個方法:
1. 從 Git 追蹤清單中移除該檔案(不會刪除你電腦裡的實體檔案):
# 如果是單一檔案
git rm --cached 檔案名稱.副檔名
# 如果是整個資料夾(例如 node_modules)
git rm -r --cached 資料夾名稱/
Code language: PHP (php)
2. 提交這次的刪除操作:
git commit -m "Remove untracked files from repository"
Code language: JavaScript (javascript)
3. 推送到 GitHub:
git push origin main
這時候 GitHub 上的檔案就消失了,但你本地資料夾裡的檔案還完好如初。
兩邊一起刪除
如果你確定這個檔案是垃圾檔案,想要本地和 GitHub 都直接刪掉:
1. 直接使用 Git 連同實體檔案一起刪除:
# 如果是單一檔案
git rm 檔案名稱.副檔名
# 如果是整個資料夾
git rm -r 資料夾名稱/
Code language: PHP (php)
2. 提交並推送:
git commit -m "Delete useless files"
git push origin mainCode language: JavaScript (javascript)
.gitignore
如果以後推錯都要用上述的方法刪除不是很麻煩嗎?不如從根源解決問題,不要讓git知道有這個檔案,但我們確實需要.env等環境變數阿,答案就是建立.gitignore ,只要寫進 .gitignore 的檔案,以後輸入 git add . 時就會自動被忽略囉!
.env # 隱私環境變數
node_modules/ # 套件資料夾
.DS_Store # Mac 系統產生的檔案
*.log # 日誌檔
Code language: PHP (php)
不小心把密碼或 API Key 推上 GitHub
如果不小心把密碼或 API Key 推上 GitHub,第一件最重要的事情不是刪除檔案,而是立刻去發行金鑰的網站(例如 Google, AWS, OpenAI)將該金鑰「停用 (Revoke) / 刪除」並重新生成一個!
因為 GitHub 有非常多機器人在 24 小時監控,一有新的 Commit,裡面的敏感資訊通常在幾秒內就會被自動爬取。所以先讓金鑰失效,才能確保主動防禦。
接下來,因為 Git 會記錄「所有歷史紀錄」,就算你用一般的 git rm 刪掉檔案,別人還是可以透過切換到舊的 Commit 看到你的密碼。我們必須使用進階的「歷史紀錄大清洗」工具。
git-filter-repo
過去大家常用 git filter-branch,但現在 Git 官方強烈推薦使用 git-filter-repo 這個 Python 工具,它速度極快且不易出錯。
1. 安裝工具: 你需要先在電腦安裝它(確保電腦有 Python 環境):
# Mac 用戶
brew install git-filter-repo
# Windows 用戶 (透過 pip)
pip install git-filter-repo
Code language: PHP (php)
2. 強制清洗特定檔案的歷史紀錄 : 切換到你的專案目錄,執行以下指令(將 config.env 替換成你不小心寫了密碼的那個檔案):
git filter-repo --path config.env --invert-paths
Code language: CSS (css)
--invert-paths代表「除了這個檔案以外,保留其他所有東西」。執行後,這個檔案就會從全宇宙的 Git 歷史紀錄中被徹底抹除。
3. 強制推送到 GitHub : 因為本地的歷史紀錄已經被你徹底重寫,與 GitHub 上的對不起來了,你必須使用 「Force Push(暴力推送)」 去覆蓋雲端:
# 由於 filter-repo 會安全地先移除原本的 remote 連結,我們需要重新綁定
git remote add origin https://github.com/你的帳號/你的專案.git
# 強制推送
git push origin main --force
Code language: PHP (php)
使用 BFG Repo-Cleaner(如果密碼散落在好幾個檔案裡)
如果你不知道密碼到底寫在哪些檔案,只知道「密碼字串本身」(例如:my_secret_password_12345),可以用 BFG 這個工具,它會像關鍵字取代一樣,把全專案歷史紀錄裡的那個字串直接變成 *** REMOVED ***。
1. 下載與準備
- 下載 BFG Repo-Cleaner 的
.jar檔案。 - 在專案外建立一個名為
passwords.txt的文字檔,把你的密碼直接寫進去(一行一個)。
2. 執行取代指令
java -jar bfg.jar --replace-text passwords.txt 你的專案資料夾名稱
Code language: CSS (css)
3. 清除 Git 快取並強制推送
cd 你的專案資料夾
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push origin main --force
