Skip to main content

Git 保留空資料夾

.gitkeep 的主要用途是:強迫 Git 追蹤並保留一個「空資料夾」——讓 clone 專案的人也能拿到必要的目錄結構,避免因找不到資料夾而報錯。

為什麼需要 .gitkeep

Git 的設計本質上是追蹤檔案的內容變更,而不是資料夾本身。若專案目錄裡有一個完全沒有檔案的空資料夾,Git 在預設情況下會直接忽略它,不會把它提交(commit)到版本控制中。

但這在開發時常常會遇到以下困擾:

  • 專案需要一個 logs/ 資料夾來放日誌,但本地還沒產生任何日誌。
  • 需要一個 uploads/ 資料夾給使用者上傳檔案,但初始專案是空的。
  • 若不把資料夾推上遠端,其他夥伴 clone 專案後,程式可能因「找不到該資料夾」而報錯(例如 Error: ENOENT: no such file or directory)。

為了解決這個問題,開發者習慣在空資料夾裡放一個佔位用的小檔案。只要資料夾裡「有檔案」,Git 就會把這個資料夾連同檔案一起放進版本控制中。


搭配 .gitignore 的實戰用法

在實際開發中,我們通常希望保留資料夾結構,但不想追蹤裡面產生的臨時檔案。這時會把 .gitkeep.gitignore 搭配使用。

範例:保留 logs/ 資料夾,但不追蹤裡面的日誌檔

logs/ 資料夾下建立兩個檔案:

  1. logs/.gitkeep:內容通常留空,單純用來佔位。
  2. logs/.gitignore:寫入以下內容,忽略目錄內所有檔案,但保留 .gitkeep 本身。
# 忽略 logs 資料夾底下的所有檔案
*

# 但排除(不要忽略) .gitkeep 本身
!.gitkeep

這樣一來,無論程式在 logs/ 裡產生多少 .log 檔,Git 都會自動忽略它們,卻仍會保留 logs/ 這個空資料夾在專案中。


關於 .gitkeep 的小冷知識

  • 它不是 Git 的官方標準: Git 官方從未定義 .gitkeep 這個特殊檔案。這純粹是開發者社群約定俗成的命名(名字看起來很像官方的 .gitignore)。實際上,在空資料夾裡放 .keepempty.txt 甚至 hello.md,效果都一樣。
  • 為什麼大家還是用 .gitkeep 因為語意清楚。任何人看到這個檔名,就知道「這是為了解決 Git 不吃空資料夾而放的佔位檔,不要刪掉它」。

總結

情境做法
只保留空資料夾在資料夾內新增 .gitkeep 並 commit
保留資料夾、忽略內容.gitkeep + 同層 .gitignore! 排除 .gitkeep
檔名是否一定要 .gitkeep否,任何佔位檔皆可;.gitkeep 只是慣例