開発ブログ
Git、CSS、HTML、正規表現など、入門者がつまづきそうなポイントを中心に、役立ち情報発信します。。

.gitignore の書き方。ファイル/ディレクトリの除外と反映方法

最終更新:2018-04-02 by Joe

.gitignoreの書き方と仕様を、具体例をまじえてまとめました。あれ〜、うまく反映されない?など、gitの仕様の理解不足からくるトラブルも解決します。

.gitignore の概要

.gitignore とは、Gitによる追跡対象としないファイルを指定するための設定ファイルです。あるディレクトリ配下をGit 管理対象としたとしても、その中野すべてのファイルを  Git 管理したいとは限りませんので、どのファイルを Gitで追跡しないようにするか、を .gitignore を使って指定する事になります。

.gitignore の仕様

まず最初に理解する必要があるのは、.gitignore に記載されたファイルは、記載された時点で「Git の追跡対象から除外される」のではなく「まだ追跡されていないファイルであれば、今後追跡されないようになる」という点です。

より具体的な動作仕様の観点では、.gitignoreに記載された事による変化としては「git add の実行時に、.gitignore に記載された対象ファイルは、インデックスに追加されないようになる」という点だと思います。

この認識がずれているがために、「あれ〜、うまく反映されない!」といった混乱が発生してしまうケースが少なくないのでしょうか。

途中から変更した.gitignore が反映されない?

さて、上述の通り、すでに一度 git add を経験したファイルは、インデックスに追加され、Git 追跡対象に含まれてしまっています。この時点で新しく .gitignore にファイル名を追記しても、Git による追跡は続き、更新内容は、コミットに含まれ続けてしまいます。

もしすでに追跡してしまっているファイルを Git の追跡対象から除外したいのであれば、下記のコマンドでトラッキングを停止することができます。このコマンドと.gitignore による設定を同時に行って下さい。

# インデックスからのみファイルを削除する(追跡対象からはずす)
git rm --cached <FILE_NAME>

インデックス領域を示すオプション「--cached」をつけることで、作業ツリーのファイル実体はそのままで、インデックスからのみファイルを削除できます。また、このオプションがない場合「git rm」は作業ツリー上のファイルの実体と、インデックスの両方を削除します。

逆に、もし作業ツリーのファイル実体のみ削除するのであれば、Git でない通常のシェルスクリプト「rm」を使ってファイルを削除することになります。

これらは状況に応じて、使い分ける事になりうます。

.gitignore の書き方

それでは、.gitignoreの正しい書き方をおさらいしましょう。

特定のファイルを追跡対象から除外する

基本形です。現状の.gitignore が置かれたディレクトリの直下のファイルか、ディレクトリに関係なくマッチする名前のファイルかどうかは、行頭の「/」の有り無しで使い分けることができます。すなわち、行頭に「/」があれば、そのディレクトリが基準となりますが、ディレクトリ名やファイル名から行頭がはじまれば、ディレクトリに無関係にそのファイルパスをマッチングします。

# .gitignore が置かれたディレクトリ内のfile.phpを除外
/file-a.php

# どのディレクトリかを問わず、file.phpを除外
file-a.php

特定のディレクトリを追跡対象から除外する

ディレクトリ配下のファイルを全て追跡対象から除外します。ファイルと同様、開始「/」を付けなければ、ディレクトリに無頓着になります。末尾の「/」はあってもなくても構いませんが、もしスラッシュがなければ、同名のファイル名があれば無視する対象になります。

# ディレクトリ配下を除外す
/directory-a/ 

# パスに無頓着に、マッチする名前のディレクトリを無視する 
directory-a/
Git でディレクトリを追跡?

Gitではそもそも空っぽのディレクトリ単体は追跡できません。Gitでは、ファイルを管理対象とし、そのファイルのパスとしてディレクトリが記録されるだけだからです。運用上の都合で、ディレクトリを無理やりレポジトリに残すために、そのディレクトリ直下に「.gitignore」を新たに追加してそのファイルを追跡対象に含めたり、または、「.keep」などの名前を付けた空ファイルを配置する慣習があります。

ワイルドカードの利用

gitignoreでは、ワイルドカード「*」が利用できます。

# 「_」で始まるファイルを追跡しない
_*

特定のファイルだけトラックする

.gitignore では通常は無視するファイルを記載しますが、逆に、特定のファイルだけを追跡対象にふくめたい場合、ワイルドカード「*」と、同時に否定を表す「!」を行頭に置くと、その行の反対、すなわし「ignoreしない」を設定できます。

# file-to-track.phpだけを追跡する。
*
!/file-a.php

このように、.gitignore では、後に書いた設定が、最初に書いた設定内容を上書きするように動作します。

特定のディレクトリ内のファイルだけをトラックする

上記での触れましたが、ディレクトリ内に何らかのファイルが配置されている事に注意して下さい。Git では空っぽのディレクトリは管理できません。

*
!/direcotry-a/

特定の拡張子を無視する

ワイルドカードを利用して、jpgとpngを無視します。どのディレクトリにあるファイルかケアしません。

*.jpg
*.png

特定の拡張子をトラックする

簡単な応用ですね。phpだけをトラックします。

!*.php

コメントアウトの書き方

.gitignoreでは、「#」でコメントアウトできます。

!*.php

エスケープの仕方

これも利用するか不明ですが、特殊文字をエスケープできます。

/\!important.txt

.gitignore のグローバル設定

レポジトリごとに .gitignore を記述するのは手間な場合、~/.config/git/inoreを記述する事で、すべてのレポジトリで設定を有効化することができます。(古いGitバージョンでは、~/.gitignore_global が該当ファイルです)

初期設定は以下のようになっていると思います。

*~
.DS_Store

当然ですが、このグローバル設定はレポジトリで管理できませんので、チームで複数人で開発する時は気をつけましょう。

【応用編】.gitignore による複雑な追跡設定

実際のプロジェクトでは、もうすこし複雑な.gitignoreを書く必要が生じることもあるかもしれません。

例えば、下記は、Wordpress開発で、コアファイルとプラグインなど無視し、テーマと設定ファイルだけをトラックする例です。もう少しキレイに書けるかもしれませんが、理解しやすさを重視して書きます。

追跡するファイル

  • /wp-content/themes/my-theme/*
  • /wp-config.php

.gitignore の例

*
!/wp-config.php
!/wp-content/
/wp-content/*
!/wp-content/themes/
/wp-content/themes/*
!/wp-content/themes/my-thenme/

.gitignore に関する参考情報

以上になります。いったん理解すれば、難しくはないですね。以下、gitの公式ドキュメントです。

それでは、楽しいgitライフを。

閉じる