gitignoreでホワイトリストを作成する #git

gitignoreで、明示的に指定したファイルしか扱えないようにホワイトリストを作成する方法について(意外と手間取ったので)残しておく。

ホワイトリスト方式とは

ここではgit管理において、明示的にgitignoreに指定したファイル以外バージョン管理としないという意味で使っています。

こんな構成をイメージ

  • 階層がある
  • 管理したいファイルや構造にルールはない
    • ファイル名や拡張子でグルーピングはできない
.
├── abc.txt
├── hoge
│   ├── aaa.txt
│   ├── fuga
│   │   ├── bbb.txt
│   │   ├── piyo
│   │   │   ├── ccc.txt
│   │   │   └── zzz.txt
│   │   └── yyy.txt
│   └── xxx.txt
└── xyz.txt

gitignore

こんな感じにするとうまく管理できる。

# すべてをignore
*
# すべてのディレクトリをホワイトリストに追加する
!*/
# ホワイトリストに入れたいファイルを戸別に許可する
!.gitignore
!xyz.txt
!hoge/aaa.txt
!hoge/fuga/yyy.txt
!hoge/fuga/piyo/ccc.txt

この例の場合、(書くまでもなさそうだけど)下記のファイルがバージョン管理対象となる。

  • xyz.txt
  • hoge/aaa.txt
  • hoge/fuga/piyo/ccc.txt
  • hoge/fuga/yyy.txt

補足

ポイントはすべてのディレクトリをホワイトリストに追加していること。

なぜわざわざこんなことをしているかというと、どうもgitignoreは上位ディレクトリがignoreされていると、下階層を再帰的には見てくれないらしい。

上述の例だと、ディレクトリをホワイトリストに入れないとaaa.txt、ccc.txt、yyy.txtはignoreされてしまう。

逆に言うと特定のディレクトリ配下を除外したい場合はそのまま指定すればよい( hoge/fuga/ とやればfuga配下は丸っとignoreされる )

ディレクトリがホワイトリストではなくなってしまうけど、gitは空ディレクトリは無視するし、.gitkeepも明示的に指定する必要があるので、実質問題ないと思う。

参考

stackoverflow.com