加了.gitignore還被Git追蹤?先分清已追蹤與未追蹤

網站的 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 若已進過版本歷史,停止追蹤不能當作處理完成,還要依專案方式撤換機密並處理歷史。

參考資料

原文鏈接:https://wntheme.com/gitignore-already-tracked-files/,轉載請註明出處。
0

評論0

顯示驗證碼
沒有帳號?註冊  忘記密碼?