簡単に言うと、.gitkeep は慣習的なダミーファイルです。その存在目的はただ一つ、本来空であるはずのフォルダを Git に強制的に追跡させることです。
なぜ必要なのか?
Git の設計思想は 「ファイルの変更を追跡すること」 であり、「フォルダを追跡すること」 ではありません。もしプロジェクトに空のフォルダがある場合、Git はそれを完全に無視し、GitHub やサーバーにアップロードしません。
これは問題を引き起こすことがあります。コードが実行されるために特定のディレクトリが存在する必要があるが、テストデータや一時ファイルをアップロードしたくない場合などです。もしディレクトリが存在しなければ、プログラムはクラッシュするかもしれません。
よくあるフォルダ例:
logs/:ログファイル用uploads/:ユーザーがアップロードしたファイルtmp/:一時ファイルcache/:キャッシュデータ
これらのディレクトリは実行時に必要で、中身はコミットすべきではありませんが、フォルダ自体は存在しなければなりません。
仕組み
Git を「騙して」このフォルダを維持させるために、機能を持たない隠しファイルを中に入れ、Git に「おっ!ここに何かあるぞ、記録しなきゃ」と思わせるのです。
実務的な例え:
家を建てている(プロジェクトを書いている)と想像してください:
| ファイル | 説明 |
|---|---|
.gitignore |
**「ゴミ捨て禁止ラベル」**のようなものです。清掃員(Git)に、どのアイテム(期限切れの食品や紙くずなど)を新居に持ち込んではいけないかを伝えます。 |
.gitkeep |
**「場所取り用の段ボール箱」**のようなものです。新居にはまだ家具がありませんが、物置のスペースを確保しておく必要があります。そこで段ボール箱を置いておき、引越し業者に「このエリアも家の一部だから取り壊さないで」と知らせるのです。 |
使い方は?
- 空のフォルダ内に
.gitkeepという名前のファイルを作成します。 - ファイルの中身は空でもいいですし、“Keep this directory” と書いても構いません。
- このファイルを
git addしてcommitします。
.gitkeep と .gitignore の比較
| 特徴 | .gitkeep |
.gitignore |
|---|---|---|
| 公式ステータス | 非公式(単なるコミュニティの慣習) | 公式(Git の組み込み機能) |
| 主な機能 | フォルダを保持し、Git に忘れられないようにする | ファイルを除外し、Git に追跡されないようにする |
| よくある状況 | 空のログフォルダ、キャッシュフォルダ | パスワードファイル、node_modules、一時ファイル |
実用的なアドバイス:発想の転換
.gitkeep は一般的によく使われますが、実は Git の公式な部分ではありません。実際、README.md や .placeholder を使っても同じ効果が得られます。では、なぜみんな .gitkeep を使うのでしょうか?それは説明不要だからです:「このファイルは何もしないけど、Git がこのフォルダを削除しないようにしているだけ」 ということが一目瞭然だからです。
もう少しプロフェッショナルに見せたいなら、単に .gitkeep を使うよりも機能的でクリエイティブなアプローチがあります:
空のフォルダに以下の内容の .gitignore を配置します:
# このディレクトリ内のすべてを無視
*
# でも私(この .gitignore ファイル自体)は無視しないで
!.gitignore
これなら、フォルダを保持しつつ、中のゴミファイルが誤ってコミットされることも防げます。これぞ真の「フールプルーフ(誤操作防止)」メソッドです。
まとめ
.gitkeepは Git の設計論理に対する人間側の妥協です。- 公式仕様ではありませんが、開発者の事実上の標準となっています。
- 本当に重要なのは
.gitignoreの仕組みを理解することです。.gitkeepは Git が空のフォルダを「理解」するのを助けるための小さな道具に過ぎません。