Don't create .gitkeep files, use .gitignore instead (2023)
Hacker News
This article explains why using a .gitignore file inside a directory is a superior method for tracking empty folders in Git compared to the traditional .gitkeep approach.
Hacker News
This article explains why using a .gitignore file inside a directory is a superior method for tracking empty folders in Git compared to the traditional .gitkeep approach.
AI 生成摘要
這篇文章解釋了為什麼在目錄中使用 .gitignore 檔案是比傳統 .gitkeep 方式更好的 Git 空目錄追蹤方法。
Git 的設計邏輯是追蹤檔案而非目錄,因此若一個資料夾內沒有任何檔案,Git 預設不會將其納入版本控制。開發者通常會使用一個名為 .gitkeep 的空檔案來「佔位」,以確保空目錄(如 build 或 logs)能被提交。本文作者 Adam Johnson 則提出另一種做法,建議直接在該目錄下建立一個包含特定規則的 .gitignore 檔案,認為這比使用非官方約定的 .gitkeep 更為簡潔且符合 Git 原生邏輯。
針對這項建議,Hacker News 社群展開了相當兩極的討論。支持者認為,使用 .gitignore 取代 .gitkeep 的最大優勢在於它利用了 Git 的原生功能,而非依賴人為約定的「偽檔案」。正如部分留言指出,.gitkeep 並非 Git 官方標準,本質上與隨便命名一個 .blahblah 檔案無異。若該目錄本身就需要忽略內部產出的暫存檔,直接將 .gitignore 納入追蹤確實能一舉兩得,且在目錄更名時也能維持其功能。
然而,反對聲音則聚焦於「意圖傳達」與「操作直覺」。許多開發者認為 .gitkeep 雖然不是官方標準,但已是業界約定俗成的慣例,能一眼看出該目錄是為了保持結構而存在。若改用 .gitignore 並在內部寫入排除規則,反而可能造成混淆,讓人誤以為該檔案只是為了管理忽略清單,而非為了保留目錄。此外,有經驗的開發者指出作者在技術細節上的瑕疵:根據 Git 文件,.gitignore 是用來指定「不被追蹤」的檔案,而已被追蹤的檔案不受影響。因此,其實不需要在檔案內寫入 !.gitignore 這種自我排除的規則,只需使用強制添加命令 git add -f 即可將其納入版本控制,後續的變更也會被自動追蹤。
另一派觀點則質疑「在 Git 中保留空目錄」的必要性。部分留言者認為,如果一個目錄是為了存放編譯產物,那麼最穩健的做法應該是在建置腳本或 Makefile 中加入建立目錄的指令,而非依賴 Git 來維護。若目錄不存在會導致程式崩潰,這通常暗示了程式碼本身的健壯性不足。不過,也有人反駁在特定場景下空目錄確實有其價值,例如 Docker 掛載點若在宿主機不存在,會自動以 root 權限建立,這常會導致權限問題;或是像 ComfyUI 等工具需要預留模型存放路徑,這時一個明確的佔位檔案能引導使用者正確操作。
有趣的是,這場討論意外釣出了 .gitkeep 命名的「始作俑者」。一位名為 jkubicek 的網友表示,他曾在 2010 年於 Stack Overflow 回答過相關問題,那可能是該名稱最早出現在網路上的紀錄。他自嘲當時的回答其實技術上並不完美,沒想到這個非官方的命名竟然成為了長達十幾年的全球開發者慣例。這段插曲也反映出,在軟體工程中,社群共識往往比技術上的「最優解」更具影響力。
在討論中,有網友分享了關於程式碼意圖與混淆的思考,引用了 The Codeless Code 網站中關於命名與約定的兩篇寓言故事(Case 222 與 Case 223),探討技術實踐中「清晰度」與「正確性」之間的權衡。此外,關於 .gitkeep 的起源,Stack Overflow 上的原始討論串(編號 4250082)也提供了關於此慣例演進的歷史背景。