網站的 config.local.json 每次改測試網址,都跑進 Git 的變更列表。你把它寫進 .gitignore,結果依然出現。先別反覆改忽略規則:.gitignore 主要處理未追蹤檔案,不會讓已追蹤的檔案自動退出版本管理。
先查檔案是否已經在索引裡
在專案根目錄執行下面兩行,將檔名換成你要檢查的路徑:
git status --short --ignored
git ls-files -- config.local.json
ls-files 若列出檔名,表示它已被追蹤。範例裡的 config.local.json 已提交過,所以修改後仍顯示 M;新建的 cache.log 沒有被追蹤,加入忽略規則後則顯示 !!。兩者不是同一種情況。
規則寫對了嗎?看實際匹配結果
以下兩行寫進專案根目錄的 .gitignore。開頭的斜線讓路徑相對於這份檔案所在目錄,避免連子目錄的同名檔案也一起忽略。
/config.local.json
/cache.log
再檢查哪一條規則命中:
git check-ignore -v -- cache.log
git check-ignore -v --no-index -- config.local.json
第二行的 --no-index 是用來檢查規則,不是解除追蹤。一般 check-ignore 預設跳過已追蹤檔案,因此沒輸出,不能直接判斷成規則失效。匹配輸出會列出規則檔、行號與模式;範例的設定檔命中 .gitignore 第 1 行。
只讓這個檔案停止追蹤
先看 git diff 和 git diff --cached,確認有哪些尚未提交的修改;另存設定檔備份,並建立處理分支。分支只保住提交位置,不能代替未提交內容的備份。若要暫存一般程式修改,可用 git stash push -u,但它會收起未追蹤檔案,並不包含已忽略檔案。
確認工作內容已保存,再精確指定一個檔案:
git rm --cached -- config.local.json
git add -- .gitignore
git diff --cached
--cached 只從索引移除檔案,本機檔案仍在;暫存差異會顯示刪除,表示下一次提交不再包含它。檢查範圍後再提交,別為了處理一個設定檔,直接移除整個專案的索引。
提交前後,回復方法不同
還沒提交時,可用 git restore --staged -- config.local.json 撤回這筆索引移除,本機內容不會因此被覆寫。這裡只撤回該檔案,.gitignore 的修改要另外核對。
提交並分享後,其他乾淨 clone 更新到該提交,原先追蹤的設定檔可能被刪除;有本機修改時也可能遇到衝突或更新被拒絕。更新前先保存各環境設定,另提供不含機密的設定範本。若要撤回已分享的變更,先備份再用新的修正提交,不要硬重設大家共用的歷史。
忽略規則也不會清掉舊提交中的內容。密碼或 token 若已進過版本歷史,停止追蹤不能當作處理完成,還要依專案方式撤換機密並處理歷史。

評論0