Skip to content
Chris Yuan | Blog
Go back

用 .gitignore 追蹤空目錄,別再用 .gitkeep 了

Edit page

Table of contents

Open Table of contents

問題:Git 不追蹤空目錄

Git 只追蹤檔案,不追蹤目錄。如果專案中需要一個空目錄(例如 build/tmp/uploads/),clone 下來後這個目錄不會存在,可能導致應用程式出錯。

常見做法:.gitkeep

最常見的解決方式是在目錄裡放一個空的 .gitkeep 檔案:

build/
└── .gitkeep

然後在專案根目錄的 .gitignore 加上:

/build/*
!/build/.gitkeep

這樣做有幾個問題:

更好的做法:目錄內的 .gitignore

在要追蹤的目錄裡放一個 .gitignore,內容只有兩行:

*
!.gitignore

就這樣。不需要修改專案根目錄的 .gitignore,不需要任何額外設定。

build/
└── .gitignore    # 內容:*\n!.gitignore

原理

因為 .gitignore 本身被追蹤,Git 就會保留這個目錄。同時目錄內的其他檔案都會被忽略,達到「追蹤空目錄」的效果。

建立方式

printf '*\n!.gitignore\n' > build/.gitignore

為什麼這個方式更好

話說回來,.gitkeep 真的那麼差嗎?

這個技巧確實巧妙,但公平地說,.gitkeep 也沒那麼糟:

另外,現代框架和工具大多會在啟動時自動建立需要的目錄(mkdir -p),CI/CD pipeline 通常也會在 build 前自己建目錄,很多時候根本不需要 Git 來保留空目錄。

什麼時候該用哪個?

場景建議做法
需要保留目錄且忽略內容(uploads/tmp/.gitignore 方式
目錄可能會改名.gitignore 方式
純粹保留一個空目錄當 placeholder.gitkeep 也行
框架或工具會自動建立目錄兩個都不需要

總結來說,.gitignore 方式在需要同時「追蹤目錄」又「忽略內容」的場景下明顯更優雅。但如果只是單純保留空目錄,.gitkeep 的可讀性其實更好。這個技巧值得知道,但不需要把專案裡所有的 .gitkeep 都換掉。

參考資料


Edit page
Share this post on:

Next Post
用自然語言設定 Ghostty — 開發 Claude Code Plugin 的經過