.gitignoreの除外設定でハマった話

Gitで管理から外したディレクトリ下のサブディレクトリだけをGitで管理しようとしたのですが、設定で戸惑ったため備忘録として設定法を残します。

正しい設定法

以下のようなディレクトリ構成の際に、 subdict_1 だけをGitで管理しようとします。

|_.gitignore
|_dict # <- このディレクトリはGit管理から外す
 |_subdict_1 # <-このディレクトリだけをGitで管理したい
 |_subdict_2
 |_subdict_3

この時は以下のように .gitignoreに記述します。

/dict/* # *が重要
!/dict/subdict_1/

注意すべき点は、* を使用することです。もし * を使用せずに以下のように設定すると、subdict_1 も管理から外れてしまいます。

/dict/
!/dict/subdict_1/

このように設定すると、Gitは dict そのもの をGitの管理下から外すため、Gitはその中にあるファイルやディレクトリについては設定することができなくなります。

一方、正しい設定用に * を使用すると、Gitは dict の中のファイルやディレクト を無視するため、除外設定を設けることができます。

ハマった所

一方、 Git 2.7.0 では * を使わなくとも期待した挙動が得られます。しかし、この機能は不具合が生じたため Git 2.7.0 限定 であり、Git 2.7.1 以降では再び * を使用する必要があります。

私は Git 2.7.4 を使用していたのですが、Git 2.7.0 以降で * の使用が必要なくなったと勘違いしたため、何故動かないのかとしばらく設定に悩む羽目になりました。

参考

.gitignoreの仕様詳解