git ready

learn git one commit at a time
by Nick Quaranto, O-Show(@oshow)

ファイルを無視する

committed 19 Jan 2009

普通、プロジェクトの何もかもを Git でバージョン管理する必要はない。コンパイルで出力されたコードや、パスワードを含んだファイル、エディタが生成してやまない一時ファイルなどがそうだ。それらを VCS で追跡し続けるのは困難だし、clone や checkout する際にも非常に煩わしい事になる。明らかに Git の仕事ではない! .gitignore とその他オプションを用いて、プロジェクト毎やユーザ毎に無視ファイルを設定する方法を学んで行こう。

一番簡単で分かりやすい方法は .gitignore ファイルをプロジェクトのルートディレクトリに作成することだ。このルートの .gitignore で無視することにしたファイルは、プロジェクトの全てのディレクトリに効果が及ぶ。SVN の svn:ignore がディレクトリ毎に設定される必要があるのと違い、一箇所で設定可能だ(Git でもサブディレクトリ毎に .gitignore を作ってもよい。 .gitignore の効果は上位の効果と合成されサブディレクトリへ伝播していく)。また .gitignore 自身もバージョン管理出来るし、そうした方が間違いなく良い。

基本的な .gitignore は以下のようになる。

$ cat .gitignore

# 特定のファイル名を指定して無視できる
.DS_Store

# ワイルドカードも使える
*~
*.swp

# パターンを指定してディレクトリやファイルを全部無視することも可能だ
tmp/**/* 

もちろん、これはもっと複雑にできる。行を ! で始めることで、無視指定に例外を作ることだって可能だ。ルールに関する例は GitHub guide on ignores を見てみるといい。

ファイルの無視で気を付けることは2つ。第一に、既に Git によって追跡されているファイルを .gitignore に追加しても、Git は追跡をやめてはくれない。 git rm --cached <file> を使いそのファイルを残しつつ追跡をやめれば、無視できる。第二に、空のディレクトリは Git で追跡することができない。追跡したければ何かをその中に入れる必要がある。とりあえず touch .gitignore をしたりすればよいだろう。

また $GIT_DIR/info/exclude を開いて編集することで、そのプロジェクトで無視するファイルを決めることも出来る( $GIT_DIR は通常 .git ディレクトリを意味する)。これの問題点は編集結果を追跡できない事だ。同じプロジェクトに参加している他の人と共有する必要がないような、個人的なファイルを無視するためにだけ使おう。

無視ファイルを指定するための最後の選択肢は、Git のコンフィグ中の core.excludesfile オプションを設定する方法だ。これはその人が使うリポジトリ全てに影響するので、今までのようなプロジェクト毎ではなくユーザ毎の設定と言える。 .gitignore をどこでもよいが例えばホームディレクトリに用意し、以下のコマンドを走らせる。

git config --global core.excludesfile ~/.gitignore

Git のファイル無視についてもっと調べたい場合は manpage を読んでみよう。ファイル無視に関する TIPS があれば、コメントで知らせて欲しい。