Gitの.gitignoreでサブディレクトリのファイルを除外するところでハマった
2012-12-14
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
ということになりますかね。
めでたしめでたし。