Git 保留空資料夾
.gitkeep的主要用途是:強迫 Git 追蹤並保留一個「空資料夾」——讓 clone 專案的人也能拿到必要的目錄結構,避免因找不到資料夾而報錯。
為什麼需要 .gitkeep?
Git 的設計本質上是追蹤檔案的內容變更,而不是資料夾本身。若專案目錄裡有一個完全沒有檔案的空資料夾,Git 在預設情況下會直接忽略它,不會把它提交(commit)到版本控制中。
但這在開發時常常會遇到以下困擾:
- 專案需要一個
logs/資料夾來放日誌,但本地還沒產生任何日誌。 - 需要一個
uploads/資料夾給使用者上傳檔案,但初始專案是空的。 - 若不把資料夾推上遠端,其他夥伴 clone 專案後,程式可能因「找不到該資料夾」而報錯(例如
Error: ENOENT: no such file or directory)。
為了解決這個問題,開發者習慣在空資料夾裡放一個佔位用的小檔案。只要資料夾裡「有檔案」,Git 就會把這個資料夾連同檔案一起放進版本控制中。
搭配 .gitignore 的實戰用法
在實際開發中,我們通常希望保留資料夾結構,但不想追蹤裡面產生的臨時檔案。這時會把 .gitkeep 和 .gitignore 搭配使用。
範例:保留 logs/ 資料夾,但不追蹤裡面的日誌檔
在 logs/ 資料夾下建立兩個檔案:
logs/.gitkeep:內容通常留空,單純用來佔位。logs/.gitignore:寫入以下內容,忽略目錄內所有檔案,但保留.gitkeep本身。
# 忽略 logs 資料夾底下的所有檔案
*
# 但排除(不要忽略) .gitkeep 本身
!.gitkeep
這樣一來,無論程式在 logs/ 裡產生多少 .log 檔,Git 都會自動忽略它們,卻仍會保留 logs/ 這個空資料夾在專案中。
關於 .gitkeep 的小冷知識
- 它不是 Git 的官方標準: Git 官方從未定義
.gitkeep這個特殊檔案。這純粹是開發者社群約定俗成的命名(名字看起來很像官方的.gitignore)。實際上,在空資料夾裡放.keep、empty.txt甚至hello.md,效果都一樣。 - 為什麼大家還是用
.gitkeep? 因為語意清楚。任何人看到這個檔名,就知道「這是為了解決 Git 不吃空資料夾而放的佔位檔,不要刪掉它」。
總結
| 情境 | 做法 |
|---|---|
| 只保留空資料夾 | 在資料夾內新增 .gitkeep 並 commit |
| 保留資料夾、忽略內容 | .gitkeep + 同層 .gitignore(! 排除 .gitkeep) |
檔名是否一定要 .gitkeep | 否,任何佔位檔皆可;.gitkeep 只是慣例 |