Gitで管理するファイルから除外したいファイルを設定するgitignoreの設定方法や書き方を説明します
除外ファイルの設定
Gitでファイルを管理するときに、管理しているフォルダ内でGitの中に含めたくないファイルがでてくると思います。
OSが自動で作成する隠しファイルやコーディング作業やテストなどで一時的にデータを格納するためのファイルなどあるでしょう。
こういったGitの管理に含めたくないファイルやディレクトリを個別に.gitignoreファイル内に指定することで、Gitコマンドを実行時にそれらを無視することができます。
複数の.gitignoreファイルをGitで管理しているディレクトリ内のどこに置くこともできます。
管理しているディレクトリのトップ階層から下の階層の.gitignoreを順に読み込みます。
ですがディレクトリごとに.gitignoreを持つととてもややこしくなるので、通常はトップ階層に1つ持って下の階層への設定もその中で行うかと思います。
こうやってGitで管理しているディレクトリ内の除外ファイルを設定できますが、Gitで管理しているディレクトリ全てで共通に除外したいファイルはあるかと思います。
OSが自動で作成しているファイルなどがそうでしょう。
macOSの.DS_StoreファイルやWindowsのThumbs.dbファイルがそうだと思います。
こういった共通に除外したいファイルは、グローバル設定に持っておけば1箇所に設定するだけで、別の場所に複数のGitで管理しているディレクトリがあっても、個別に設定を持つ必要がありません。
グローバル設定の方法は2つあります。
- ユーザーのHOMEディレクトリにある~/.gitconfigに任意のファイル名を設定する
- ユーザーのHOMEディレクトリにある~/.config/git/ignoreに設定する
1.の.gitconfigの設定は以下のコマンドを使って設定します。
git config –global core.excludesFile ~/[ファイル名]
コマンドを実行すると.gitconfigファイルに以下の内容が記述されます。
[core]
excludesFile = ~/[ファイル名]
この内容は直接.gitconfigに記述してもよいです。
[ファイル名]は任意のファイル名を指定します。
つまり、任意のファイルに除外するファイルの設定をすることができます。
よく情報として見かけるのが、「.gitignore_global」ファイルに除外設定する方法かと思います。
この場合は「git config –global core.excludesFile ~/.gitignore_global」のコマンドを実行して.gitignore_globalファイルの除外設定を有効にします。
2.の「~/.config/git/ignore」ファイルは、1.の設定がない場合のデフォルトに設定されるものです。
1.の設定がない場合はこのファイルに設定されている内容で除外を行います。
システムによってはこのignoreファイルは自動的に作成されている場合もあります。
例えば、macOSはGitを使うのにXcodeをインストールすればGitも自動的にインストールされ、このignoreファイルも必要な設定内容が記述された状態で作成されている場合もあります。
gitignoreの書き方
除外するファイルやディレクトリの記述は以下の基本ルールで書きます。
- .gitignoreファイルがあるディレクトリ以下がサブディレクトリ含めて除外対象となります。
- #で始まる行はコメントとして機能します。
- 空白行はどのファイルとも一致せず解釈されません。
- #や末尾の空白を文字として扱いたいときは前に「\」を置きます。(例:\#)
- /を含まないファイル名やディレクトリ名を記述している行は、.gitignore以下を全てのサブディレクトリも含めてこの名前のファイルやディレクトリを除外します。(例:hello.txt, fooなど)
- 末尾以外にのみ/を含むファイル名やディレクトリ名を記述している行は、.gitignoreがある場所を基準にして相対パスで指定されるファイルやディレクトリを除外します。(例:/hello.txt, /foo/to/hello.txt, foo/to/hello.txtなど)
- 末尾にのみ/を含むファイル名やディレクトリ名を記述している行は、.gitignore以下の全てのサブディレクトリを含めてこの名前のディレクトリを除外します。(例:foo/など)
- 末尾以外にも末尾にも/を含むファイル名やディレクトリ名を記述している行は、.gitignoreがある場所を基準にして相対パスで指定されるディレクトリを除外します。(例:/foo/, sub/to/foo/など)
- 「!」で始まる行は、除外しないファイルやディレクトリとなります。(例:!hello.txt)
- 「*」はスラッシュ「/」以外のすべてと一致するワイルドカードです。(例:hello.*や*.classなど)
- 「?」は「/」以外の任意の1文字に一致します。(例:hello_?.txtなど)
- [a-zA-Z]などのように範囲の文字に一致するように記述することもできます。(例:hello_[a-zA-Z].txtなど)
- 「*」を2つ連続で記述「**」すると特別な意味を持つ場合があります。
- 「**/foo」は「foo」と同じ意味になります。
- 「abc/**」は、.gitignoreファイルの場所を基準にしてディレクトリ「abc」内のすべてのファイルに一致します。
- 「a/**/b」は複数のディレクトリと一致します。(a/b, a/x/b, a/x/y/bなどに一致)
【公式サイトによる説明】
公式サイト:https://git-scm.com/docs/gitignore
上記ルールのもとに記述する除外したいファイルやディレクトリは、.gitignoreのあるディレクトリからの相対パスを記述し、OS環境の絶対パスは記述できません。
/から始まるパスの記述は絶対パスではないので気をつけてください。
つまり「hello.txt」と書いた場合は、.gitignoreファイルのある場所から、その配下のすべてのサブディレクトリを含んでhello.txtファイルを除外します。
「/hello.txt」と書いた場合は、.gitignoreファイルのある場所のhello.txtのみを除外します。
「/foo/」と書いた場合は、.gitignoreファイルのある場所のfooディレクトリのみを除外します。
例えば特定のフォルダにあるhello.txtだけを除外したい場合は「/foo/hello.txt」のように記述します。
OSやアプリなどのツールが作成するファイルを除外したい場合は多いと思います。
そのように環境に応じて適切な設定内容を作ってくれるサービスもあります。
gitignore.io(https://gitignore.io/)
このサイトへアクセスし、対象とする環境をフィールドに入力してCreateを押すと適切な設定内容を出力してくれます。
ディレクトリの特定のファイルは管理してそれ以外を除外したい場合
あるディレクトリは基本すべて除外したいのだけど、その中のある特定のファイルだけ管理対象としたい場合は以下のように設定します。
# 以下ディレクトリは除外するが特定のファイルだけ管理する /foo/* !/foo/hello.txt
「/foo/*」の「*」はなくても動作しそうに見えますが、「/foo/」の場合はファイルを特定しないでfooディレクトリ配下の全てとなり、次の行の設定が有効になりません。
設定したのに除外してくれない場合
除外設定をする前に「git add」コマンドでインデックスに登録している場合は、そのファイルやディレクトリは除外対象にはなりません。
gitignoreで除外できるのはまだインデックスに登録していないものだけです。
設定したのに除外してくれない場合の多くは、すでにインデックスに登録しているものを除外しようとしている場合です。
こういった場合は、ファイルを削除するかファイル情報をキャッシュから削除することで再び除外できるようになります。
ファイルの削除やキャッシュの削除は以下のコマンドで行います。
[ファイル削除]
git rm foo/hello.txt
[キャッシュ削除]
git rm --cached foo/hello.txt
ファイル削除とキャッシュ削除の違いは、ファイルの実体を残して再び除外設定をしたい場合はキャッシュの削除だけを行います。
よくあるのはソースファイルだけを管理したいのに、コンパイルしたときに生成されたバイナリファイルも含めてインデックスに登録してしまったとき、コンパイルでできたファイルは残したいけど除外したい場合があるかと思います。
このような場合はキャッシュだけを削除すれば除外設定が有効になります。
まとめ
.gitignoreファイルを作って除外設定すればディレクトリごとに設定できますが、どのディレクトリでも共通に除外したいファイルやディレクトリは多いのではないでしょうか。
結局はどこにあろうと除外したいファイルを設定したい場合が主にあるときは、~/.config/git/ignoreファイルに除外設定するのがわかりやすいのでおすすめです。