顛倒 .gitignore:只追蹤明確允許的檔案
在日常開發中,Git 的 .gitignore 常被當作「把不想要的檔案挑出來」的工具。許多開發者習慣先把所有檔案都加入版本控制,等到發現 .DS_Store、node_modules、IDE 設定檔、甚至環境變數檔意外被提交後,才匆忙把它們寫入 .gitignore、清除歷史紀錄。這種事後補救的流程不僅耗時,也容易留下遺漏。
什麼是「顛倒」的 .gitignore?
作者提出一種相反的思路:預設忽略所有檔案,只允許明確列出的檔案被追蹤。以一個簡單的 Go 專案為例,.gitignore 內容如下:
* # 忽略全部
!.gitignore # 例外:gitignore 本身
!*.go # 例外:所有 Go 原始碼
!go.mod # 例外:模組宣告檔
!go.sum # 例外:依賴鎖定檔
# 其他想保留的檔案寫在此處
在這個設定下,只有被 !(感嘆號)標記的檔案會被 Git 追蹤,其他任何檔案—不論是臨時產生的快取、測試資料或是個人化設定—都會自動被排除。
為何值得考慮?
-
防止意外提交
開發者不必再擔心忘記把新產生的
*.log、tmp/或是機密的.env檔案加入忽略清單,因為預設已經把所有東西都過濾掉。 -
保持乾淨的倉庫歷史
由於不會出現「先提交、後清除」的情況,Git 歷史更能忠實反映真正的程式碼變更,減少因為歷史重寫(
git filter-branch、git rebase)而產生的衝突。 -
降低新加入成員的門檻
新手只要把需要的檔案列入白名單,即可直接開始貢獻,避免因為忘記更新
.gitignore而被 CI(持續整合)檢查阻擋。
可能的挑戰與限制
-
維護白名單成本
每次新增檔案類型或工具(例如加入測試框架、產生自動文件)時,都必須手動在
.gitignore中加入例外。對於快速迭代的專案,這可能稍嫌繁瑣。 -
不適用所有倉庫
某些大型開源專案已經有成熟的忽略規則,改為全域忽略可能會破壞既有的開發流程。此策略更適合新建專案或是內部工具。
-
工具相容性
某些 IDE 或自動化腳本會在專案根目錄產生隱藏檔案(如
.vscode/、.idea/),若忘記把它們列入白名單,開發者可能會在本機看到功能缺失。
實務小技巧
- 想快速檢查某路徑是否被忽略,可執行
git check-ignore -v <path>,系統會回傳匹配的規則,省去「找不到檔案卻不在 Git」的疑惑。 - 若偏好圖形化或終端介面的 Git 客戶端,lazygit 是目前口碑極佳的 TUI(文字使用者介面)工具,搭配上述
.gitignore能更直觀地觀察哪些檔案被追蹤、哪些被排除。
結語:從「事後」到「事前」的思維轉變
將 .gitignore 從「只排除」改為「只允許」的做法,雖非萬用解答,卻提供了一條避免雜訊檔案侵入版本庫的清晰路徑。對於追求乾淨、可追溯的程式碼基礎建設的團隊而言,值得在新專案的起始階段嘗試此策略。未來,隨著工具鏈持續演進,或許會出現自動產生白名單的輔助腳本,讓「顛倒」的 .gitignore 成為更易上手的標準做法。