空のディレクトリを残すには?.gitkeep と .gitignore の選び方

通常の Git add と checkout では、ディレクトリ内のファイルを通して構造を残します。各ディレクトリで1つの方法を選びます。後で内容を追加する予定なら .gitkeep、生成物を継続して無視するなら .gitignore が使えます。

1. 将来の内容のためにプレースホルダーを置く

uploads を作成し、エディターで空の uploads/.gitkeep を作って、このファイルをステージします。

git add -- uploads/.gitkeep

インデックスに uploads/.gitkeep があることを確認します。.gitkeep は慣例名で、Git の特別な機能ではありません。用途を説明する README でも構いません。後から追加するファイルを自動的に無視する機能はありません。

git ls-files -- uploads/

2. ディレクトリを残して生成物を無視する

別の方法として uploads/.gitignore を作成し、次の2行を入れます。* が内容を無視し、!.gitignore がルールファイル自体の追跡を可能にします。この方法を選ぶ場合、.gitkeep の方法と併用する必要はありません。

このルールファイル自体が追跡するプレースホルダーです。ディレクトリにはこのファイルが存在し、ルールを変えるまでは後のファイルも無視されます。

*
!.gitignore

! を使っても無視されたディレクトリ内のファイルを残せないのはなぜ?

3. 選んだ方法を検証する

.gitignore の方法では、ルールファイルをステージします。

git add -- uploads/.gitignore

uploads/example.bin を作成し、一致ルールを確認します。

git check-ignore -v -- uploads/example.bin

インデックスには uploads/.gitignore があり、example.bin はないはずです。親のルールが uploads 自体を除外している場合は、先にそのルールを直して、Git が下位の .gitignore を読めるようにします。

git ls-files -- uploads/

フォルダーを無視するには?folder/ と /folder/ の違い

正確な動作や詳細は、公式の資料を参照してください。 Git のドキュメント · git add の公式ドキュメント