Gitの基礎 - GitIgnore
概要
.gitignoreファイルは、Gitのトラッキングの対象外とするファイルおよびディレクトリを指定するファイルである。
.gitignoreファイルは複数のディレクトリに配置することができ、より深い階層にある.gitignoreファイルの方が優先順位が高くなる。
.gitignoreファイルの基本
- ファイル名およびディレクトリ名のみ(/を含まない)
- .gitignoreファイル以下の全てのサブディレクトリ下にあるこの名前のファイルおよびディレクトリを無視する。
- 末尾以外にのみ/を含む場合 (/file、/path/to/file、path/to/file等)
- .gitignoreファイルが存在するディレクトリをカレントディレクトリとする相対パスで指定されるファイルおよびディレクトリを無視する。
- 末尾のみ/がある場合 (directory/等)
- .gitignoreファイル以下の全てのサブディレクトリ下にあるこの名前のディレクトリを無視する。
- 末尾および末尾以外にも/を含む場合 (/directory/、/path/to/directory/、path/to/directory/等)
- .gitignoreファイルが存在するディレクトリをカレントディレクトリとする相対パスで指定されるディレクトリを無視する。
- !で始まる場合 (!/path/to/file等)
- !以降のパターン文字列が示すファイルおよびディレクトリを無視しない。
- 前の無視指定を上書きする。
- 以降の無視指定に上書きされる。
- 空行または#で始まる場合
- 解釈されない。(#はコメントと見なされる)
.gitignoreファイルと同階層のディレクトリにあるfileのみを無視する場合は、/fileと記述する。
また、Gitリポジトリのルート、あるいは、OSのルートからの絶対パス指定をすることはできない。
.gitignoreファイルは、それ以降のディレクトリにのみ影響を及ぼす。
ワイルドカード
- *
- /以外の0文字以上の文字列にマッチする。
- ?
- /以外の1文字にマッチする。
- [0-9]
- /以外の指定した1文字にマッチする。
- **
- 0個以上のファイル、または、ディレクトリにマッチする。
- /a/**は、/a、/a/x、/a/x/y等にマッチする。
- /**/bは、/b、/x/b、/x/y/b等にマッチする。
- /a/**/bは、/a/b、/a/x/b、/a/x/y/b等にマッチする。
- **/は、全てのディレクトリ (トップレベルおよびサブディレクトリ) を意味する。
- ディレクトリの場合は末尾に/を付加することにより、ディレクトリであることを明示する。
例えば、.outという拡張子のファイルを全て除外する場合は、*.outと記述する。
以下の例では、プロジェクトディレクトリにある全てのhogeディレクトリ、piyoディレクトリ、fooファイル、barファイルを再帰的に除外している。
この設定により、プロジェクト内のどの階層にあっても、指定されたファイルとディレクトリはGitの管理対象から除外される。
# ディレクトリ **/hoge **/piyo # ファイル **/foo **/bar
エスケープ
.gitignoreファイルでは、、\
(バックスラッシュ)を使用して、特殊文字をエスケープすることができる。
- #文字をエスケープする
- \#*#
備考
git add
コマンドを使用してインデックスに登録、または、コミット済みのファイルが存在する場合、
.gitignoreファイルは、該当ファイルを無視しない。
もし、上記のようなファイルを無視する場合は、git rm
コマンドを実行する。
git rm <ファイル名またはディレクトリ名> # または git rm --cached <ファイル名またはディレクトリ名>
--cached
オプションを付加する場合- 該当ファイルまたは該当ディレクトリをワーキングツリーから削除しない。
--cached
オプションを付加しない場合- 該当ファイルまたは該当ディレクトリをワーキングツリーから削除する。
- 例えば、コンパイルの生成物を誤ってインデックスに登録した場合や削除する予定のデバッグ用ファイル等を誤ってインデックスに登録した場合等に使用する。
以下の例では、tmpディレクトリ下にある全てのファイルにおいて、remain.txtファイルのみを無視している。
ディレクトリを無視する場合、そのディレクトリ中の一部のファイルやディレクトリのみ無視しないようにすることはできないという制限を設けている。
そのため、tmpディレクトリ下の全てのファイルやディレクトリを無視してから、特定のファイルのみを除外する必要がある。
├ .gitignore └ tmp ├ remain.txt ├ remove1.txt ├ remove2.txt └ remove3.txt
# .gitignoreファイル /tmp/* !/tmp/remain.txt