Gitを使って開発していると、「空のディレクトリもGitリポジトリに含めたい」という場面があります。
例えば、あとからファイルを配置する予定のディレクトリなど、最初は中身が空でも、あらかじめディレクトリだけ用意しておきたい場合です。
しかし、Gitでは空のディレクトリそのものを管理することはできません。
このようなときによく使われるのが、.gitkeepというファイルです。
この記事では、.gitkeepの基本的な意味や使い方から、.gitignoreとの違いや使い分けまで、初心者向けにわかりやすく解説します。
.gitkeepとは?
.gitkeepとは、空のディレクトリをGitリポジトリに含めるためによく使われるファイルです。
Gitは基本的にファイルを通してディレクトリ構造を管理しているため、中にファイルが1つも存在しない空のディレクトリは、そのままではGitリポジトリに含めることができません。
例えば、次のようなuploadsディレクトリがあるとします。
project/
└── uploads/uploadsディレクトリの中にはファイルが存在しないため、この状態ではGitで管理できません。
そこで、uploadsディレクトリの中に.gitkeepを作成します。
project/
└── uploads/
└── .gitkeepGitは.gitkeepというファイルを管理できるため、結果としてuploadsディレクトリもGitリポジトリに含めることができます。
.gitkeepの作り方
.gitkeepは通常のファイルなので、特別なGitコマンドを使用して作成する必要はありません。
例えば、Linux、macOS、WSLなどでは、次のコマンドを実行します。
touch uploads/.gitkeepこれで、uploadsディレクトリの中に空の.gitkeepが作成されます。
作成した.gitkeepをGitで管理する場合は、次のコマンドを実行します。
git add uploads/.gitkeepその後、コミットします。
git commit -m "Add uploads directory"これで、.gitkeepがGitで管理され、uploadsディレクトリを含めた状態をGitリポジトリに保存できます。
.gitkeepの中には何を書く?
基本的に、.gitkeepの中には何も書く必要はありません。
.gitkeepの目的は、そのファイル自体をGitで管理することで、空だったディレクトリをGitリポジトリに含めることです。
そのため、通常は空ファイルとして作成します。
.gitkeepの中に設定や特別な文字列を記述しても、それをGitが特別に解釈することはありません。
複数の空ディレクトリで.gitkeepを使用する
Gitリポジトリに含めたい空のディレクトリが複数ある場合は、それぞれに.gitkeepを配置できます。
例えば、次のようなディレクトリがあるとします。
project/
├── uploads/
├── migrations/
└── data/それぞれが空の場合は、次のように.gitkeepを配置します。
project/
├── uploads/
│ └── .gitkeep
├── migrations/
│ └── .gitkeep
└── data/
└── .gitkeepそれぞれの.gitkeepをGitで管理することで、これらのディレクトリをGitリポジトリに含めることができます。
.gitkeepは削除してもよい?
.gitkeepを配置したディレクトリに、別のGit管理対象ファイルが追加された場合は、.gitkeepを削除しても問題ありません。
例えば、最初は次の状態だったとします。
uploads/
└── .gitkeepその後、Gitで管理するREADME.mdを追加したとします。
uploads/
├── .gitkeep
└── README.mdこの場合、README.mdがGitで管理されるため、ディレクトリをGitリポジトリに残すという目的だけであれば.gitkeepは不要です。
uploads/
└── README.mdただし、将来的にREADME.mdを削除して再びディレクトリが空になる可能性がある場合は、.gitkeepを残しておいても問題ありません。
.gitkeepを使用する場面
.gitkeepは、初期状態では空でも、Gitリポジトリをクローンした時点から存在してほしいディレクトリがある場合に使用します。
例えば、次のような場面です。
- 後からファイルを追加する予定のディレクトリ
- マイグレーションファイルなどを配置するためのディレクトリ
- プロジェクトのディレクトリ構成として最初から残しておきたいディレクトリ
- アプリケーションで使用するため、クローン直後から存在してほしいディレクトリ
一方、ビルドやアプリケーションの実行時に自動的に作成されるディレクトリであれば、必ずしもGitリポジトリに含める必要はありません。
例えば、ビルド時に自動生成される出力先ディレクトリであれば、必要になったときに自動で作成できるため、.gitkeepを使用しない場合もあります。
つまり、.gitkeepは「空のディレクトリだからとりあえず置く」のではなく、プロジェクトの初期状態からそのディレクトリが必要な場合に使用すると分かりやすいでしょう。
.gitkeepはGitの正式な機能ではない
.gitkeepという名前を見ると、.gitignoreのようにGitに用意されている特別なファイルだと思うかもしれません。
しかし、.gitkeepはGitの正式な機能ではありません。
Gitから見ると、.gitkeepも通常のファイルの1つです。
そのため、空のディレクトリをGitリポジトリに含めるためのファイル名は、必ず.gitkeepである必要はありません。
| 項目 | 内容 |
| Gitの正式な機能? | いいえ |
| ファイルの中身 | 基本的に空 |
| 他の名前でもいい? | はい(.keep、.placeholderなども使われる) |
例えば、次のように.keepという名前のファイルを配置しても、Gitで管理できます。
uploads/
└── .keepGitにとって重要なのは.gitkeepという名前ではなく、ディレクトリの中にGitで管理するファイルが存在することです。
なぜ.gitkeepという名前?
.gitkeepはGitの公式機能ではありませんが、開発者の間で慣習的によく使われているファイル名です。
.gitkeepという名前が使われる理由として、次のような点があります。
.gitで始まるため、Gitに関連する目的のファイルだと分かりやすいkeepには「保持する」「残しておく」という意味があり、用途をイメージしやすい- 多くのプロジェクトで使われているため、空のディレクトリを残すためのファイルだと理解されやすい
必ず.gitkeepという名前にする必要はありませんが、特別な理由がなければ.gitkeepを使用すると、他の開発者にも目的が伝わりやすくなります。
.gitkeepと.gitignoreの違い
.gitkeepと名前が似ているものに.gitignoreがありますが、それぞれの役割は異なります。
| .gitkeep | .gitignore | |
| 主な役割 | 空のディレクトリをGitリポジトリに残すためによく使用する | Gitで管理したくないファイルやディレクトリを指定する |
.gitkeepは、Gitで管理する通常のファイルです。
一方、.gitignoreは、Gitで管理したくないファイルやディレクトリのパターンを記述するためのファイルです。
例えば、.logで終わるファイルをGitで管理したくない場合は、.gitignoreに次のように記述します。
*.logこれにより、app.logやerror.logなどのファイルをGitの管理対象から除外できます。
つまり、簡単にいうと、.gitkeepは「空のディレクトリをGitリポジトリに残すためによく使うファイル」、.gitignoreは「Gitで管理しないファイルを指定するためのファイル」です。
また、.gitkeepはGitの正式な機能ではありませんが、.gitignoreはGitが認識する正式な仕組みという違いもあります。
.gitkeepと.gitignoreはどう使い分ける?
空のディレクトリをGitリポジトリに残したい場合は、後からそのディレクトリに作成されるファイルをGitで管理したいかどうかによって、.gitkeepと.gitignoreを使い分けると分かりやすくなります。
| 状況 | .gitkeep | .gitignore |
| 空の状態でもディレクトリを残し、後から追加されるファイルをGitで管理したい | 使用する | 基本的には使用しない |
| ディレクトリは残したいが、後から生成されるファイルをGitで管理したくない | 基本的には使用しない | 使用する |
後から追加されるファイルをGitで管理したい場合
例えば、マイグレーションファイルを保存するmigrationsディレクトリがあるとします。
最初は空ですが、後から追加するマイグレーションファイルはGitで管理したい場合があります。
このような場合は.gitkeepを配置します。
migrations/
└── .gitkeepその後、マイグレーションファイルを追加すると、次のようになります。
migrations/
├── .gitkeep
└── 001_create_users.sql001_create_users.sqlには無視する設定がないため、通常どおりGitで管理できます。
後から追加されるファイルをGitで管理したくない場合
一方、ログファイルなど、後から自動生成されるファイルをGitで管理したくない場合があります。
例えば、logsディレクトリ自体はGitリポジトリに含めたいものの、中に生成されるログファイルは管理したくない場合です。
このような場合は、logs/.gitignoreに次のように記述する方法があります。
*
!.gitignore*によってディレクトリ内のファイルを無視し、!.gitignoreによって.gitignore自身は無視しないようにしています。
ディレクトリ構成は次のようになります。
project/
└── logs/
└── .gitignore.gitignore自体がGitで管理されるため、別途.gitkeepを配置しなくてもlogsディレクトリをGitリポジトリに含めることができます。
その後、app.logが作成された場合は次のようになります。
project/
└── logs/
├── .gitignore
└── app.logこの場合、.gitignoreはGitで管理されますが、app.logはGitの管理対象から除外されます。
つまり、後から追加されるファイルを通常どおりGitで管理したい場合は.gitkeepを使用し、ディレクトリ内に生成されるファイルをGitで管理したくない場合は.gitignoreを使用すると分かりやすいでしょう。なお、.gitignore自体をGitで管理すればディレクトリもGitリポジトリに含められるため、この場合は別途.gitkeepを配置する必要はありません。
本記事のまとめ
この記事では「.gitkeep」について、以下の内容を説明しました。
.gitkeepは、空のディレクトリをGitリポジトリに含めるためによく使われるファイル.gitkeepは通常、空ファイルとして作成する.gitkeepはGitの正式な機能ではなく、開発者の間で慣習的に使われている名前.gitkeep以外にも.keepや.placeholderなどの名前を使用できる- 空のディレクトリを残しつつ、後から追加されるファイルをGitで管理したい場合は
.gitkeep、ディレクトリは残したいものの、後から生成されるファイルをGitで管理したくない場合は.gitignoreを使い分けると分かりやすい
.gitkeepは非常にシンプルな仕組みですが、Gitが空のディレクトリそのものを管理しないことを理解すると、なぜ必要なのかが分かりやすくなります。
用途に応じて.gitkeepと.gitignoreを使い分けるとよいでしょう。
お読みいただきありがとうございました。