Gitによるバージョン管理において、特定のファイルを管理から除外する設定の解説です。
グローバルな設定とディレクトリ単位の設定
グローバルな設定
Gitで管理するすべてのプロジェクト(ディレクトリ)に対して除外設定をするには、~/.config/git/ignore
ファイルを作成してこれに設定を記述します。
# ユーザディレクトリ直下に .config ディレクトリがなければ作成します(あると思うけど)。
% mkdir ~/.config
# .config下に git ディレクトリがなければ作成します(これはないかも)。
% mkdir ~/.config/git
# ignore ファイルを作成します。
touch ~/.config/git/ignore
ディレクトリ単位の設定
Gitで管理する特定のディレクトリに対して除外設定をするには、そのディレクトリ下に.gitignore
ファイルを作成します。
.gitignore
を設置したディレクトリとその下位ディレクトリで設定が有効になります。
.gitignore
ファイルはプロジェクトのルートディレクトリの他、サブディレクトリにも設置することができます。複数の.gitignore
が設置されている場合、深い階層のものが優先されます。
記述方法
~/.config/git/ignore
または.gitignore
ファイルに、管理から除外したいファイルやディレクトリの名前を記述します。改行で区切って複数の記述をすることができます。
コメント
# #で始まる行はコメントです 無視されます
名前で指定
名前を記述した場合、その名前と一致するファイル・ディレクトリを無視します。サブディレクトリ下のファイルもマッチします。
# すべての password.txt という名前のファイル・ディレクトリにマッチ
password.txt
ディレクトリを指定
名前の末尾に/
を付けた場合、ディレクトリとみなされます。サブディレクトリ下のディレクトリもマッチします。
# すべての log という名前のディレクトリにマッチ
log/
相対パスで指定
末尾以外に/
を含む場合、.gitignore
を設置したディレクトリを起点とする相対パスとみなされます。
# .gitignore を起点とした path/to/directory にマッチ
path/to/directory
# 上記と同じ 先頭の / はあってもなくても同じ
/path/to/directory
ワイルドカード
* | / 以外の0文字以上の文字列にマッチ |
? | / 以外の1文字にマッチ |
[] | / 以外の指定した1文字にマッチ [0-9] 、[a-zA-Z] など |
** | 0個以上のファイルまたはディレクトリにマッチ |
# 拡張子が .log のファイル・ディレクトリにマッチ
*.log
# file-a, file-b などにマッチ
file-?
# file-0 から file-9 にマッチ
file-[0-9]
# /foo, /foo/bar, /foo/bar/baz などにマッチ
/foo/**
# /foo, /bar/foo, /bar/baz/foo などにマッチ
/**/foo
# /foo/bar, /foo/baz/bar, /foo/baz/qux/bar などをにマッチ
/foo/**/bar
打ち消し
!
で始まる場合、!
以降のパターンにマッチするファイルやディレクトリを無視しません。これより前に行った除外設定を打ち消すときに使います。
# /file だけを追跡する
*
!/file
ご注意ください。Gitはディレクトリを無視する設定をした場合に、そのディレクトリの配下のファイルの除外設定を打ち消すことができないという制約があります(ややこしい)。
# この場合、打ち消すことはできない
/foo/
!/foo/bar
#これならOK
/foo/*
!/foo/bar
除外設定が反映されないときは
これまで.gitignore
に記載されたファイルは Git による管理から除外されると説明してきましたが、嘘でした。
正確に言うと、.gitignore
に記載されたファイルはgit add
を実行したときにインデックスに追加されないんです。つまり、すでにインデックスに追加されているファイルは後から除外設定をしても手遅れなのです。アーメン。
このような場合はgit rm
コマンドでインデックス済みファイルをインデックスから削除しましょう。--cached
オプションを付けるとインデックスからのみ削除します。付け忘れるとワーキングツリーからも削除されてしまいますのでご注意を。
# ファイル名を指定してインデックスから削除
git rm --cached <ファイル名>
# または、すべてのファイルをインデックスから削除(ファイルが複数ある場合はこれでもOK)
git rm -r --cached .
# あらためて add
git add .
# コミット
git commit -m "除外設定を変更"
何を除外するべきか
具体的にどんなファイルをGitの管理から除外するべきなのでしょうか。さまざまな環境で使える.gitignore
のテンプレートが用意されています。あら便利。
上記のテンプレートが完璧すぎて私はもう何も言えないのですが、細かすぎてめんどくせーよというあなたのために、もうちょっとざっくりとした提案をしてみますね。
# マカーならばこれ
.DS_Store
# ドザならばこれ
Thumbs.db
# Node.js を使っているならばこれ
/node_modules/
# Composer を使ってるならばこれ
/vendor/
# パスワードが記載されているファイルは push したくないならばこれ
password.txt
# ログファイルは追跡しないならばこれ
*.log
node_modules
やvendor
は除外するしないで意見が分かれるところですが、私は除外する派です。
でわでわ
コメント