Gitの.gitignoreでサブディレクトリのファイルを除外するところでハマった

Gitでバージョン管理したくないファイルを指定する場合には、.gitignoreファイルを作成し、その中に除外パターンを書く。

*.swp
._*
.DS_Store
node_modules
release
.sass-cache

こういう感じ。その.gitignoreファイルからみた除外したいパターンのパスを書く。Gitのドキュメントから引用すると、下記のようなパターンで除外ファイルを指定できる。こちらから日本語訳として引用。

# コメント。これは無視されます
*.a       # .a ファイルは無視
!lib.a    # しかし、lib.a ファイルだけは .a であっても追跡対象とします
/TODO     # ルートディレクトリの TODO ファイルだけを無視し、サブディレクトリの TODO は無視しません
build/    # build/ ディレクトリのすべてのファイルを無視します
doc/*.txt # doc/notes.txt は無視しますが、doc/server/arch.txt は無視しません

で、ハマったところ

今回はプロジェクトにおいて除外したい特定ファイルがある。対処のディレクトリは下記のような構成になっており、

projects/templates/
projects/templates/pages/foo.html
projects/templates/pages/foo.js
projects/templates/pages/mypage/bar.js
projects/.gitignore

templates/以下の.jsを無視したい、というのをやりたかった。このとおり、templates/以下に展開するサブディレクトリのパターンは様々。そしてルートには、そのプロジェクトディレクトリとしての.gitignoreがあり、その中には.DS_Storeなどの定番の除外パターンを書いてある。

で、このルートにある.gitignoreに対し、下記のようなパターンを書いた。

templates/**/*.js

これによって、各階層が異なるサブディレクトリも対象とて、その中のjsファイルを除外するというができると思ったが、だめだった。これによって除外されるのは、

templates/pages/foo.js

だけ、となる。

じゃあ、階層ごとに、

templates/*.js
templates/**/*.js
templates/**/**/*.js

みたいに書く、というのは全然よろしくない。

と思ったところで、鶏ハムの人に助言をもらい、templates/に.gitignoreを追加した。

## projects/templates/.gitignore に下記を記述
*.js

するとどうでしょう、理想通り、templates/以下のjsファイルが除外されましたとさ。

ちなみに、この書き方だとtemplates/直下にあるjsしか除外されない気がしたのだけど、よく考えればそれは、

## projects/templates/.gitignore に下記を記述
/*.js

ということになりますかね。

めでたしめでたし。