サブディレクトリを含めて .gitkeep だけ残したい

Git は「空のディレクトリそのもの」をコミットできない。空のディレクトリをあえて Git 管理に含めたい時には、.gitkeep という空ファイルを配下に置いておく習慣がある。

今回、以下のような構成のサブディレクトリたちをコミットしたかったのだが、そのための .gitignore の書き方に迷ったのでメモしておく。

保存したいディレクトリ構成はこんな感じ。

git-repository/
├ .gitignore
├ README.md
└ parent-directory/
   ├ .gitkeep
   ├ child-directory-a/
   │ ├ コレは Git 管理から除外したい.txt
   │ └ .gitkeep
   └ child-directory-b/
      ├ コレは Git 管理から除外したい.txt
      └ .gitkeep

このような場合に、parent-directory/.gitkeep は念のため保存しつつ、

も Git 管理に含めるが、それ以外のファイルは除外する、という .gitignore 指定をしたかった。

結論はこう書く。

/parent-directory/**
!/parent-directory/**/
!/parent-directory/**/.gitkeep

1行目で parent-directory/ 配下のファイルを除外設定に加えておき、2・3行目で配下の .gitkeep を再帰的に見つけ出して例外設定に加えてくれる。特に2行目が直感的に分からないので、このイディオムで覚えておきたいところだ。