Gitを使って開発していると、「このファイルはGitで管理したくないけれど、.gitignoreには追加したくない」ということがあります。
例えば、自分だけが使用しているエディターの設定ファイルや、AIツールが生成したファイル、個人的な作業用ファイルなどです。
.gitignoreに追加すると、その変更をコミットした場合はチームメンバーにも影響します。そのため、自分の環境だけで特定のファイルやディレクトリを無視したい場合には適していないことがあります。
このようなときに使用できるのが、.git/info/excludeです。
この記事では、.gitignoreを変更せずにファイルをGitの管理対象から除外する方法として、.git/info/excludeの使い方やグローバルな除外設定との違いを、初心者向けにわかりやすく解説します。
.gitignoreを使わずにファイルを無視する方法
Gitでは、.git/info/excludeにファイル名やディレクトリ名を記述することで、そのリポジトリ内だけでファイルを無視できます。
簡単にいうと、.git/info/excludeは「自分のローカル環境だけで使用する.gitignore」のようなものです。
例えば、次のようなファイルがあるとします。
sample-project/
├── .git/
├── src/
├── memo.txt
└── README.mdmemo.txtは自分の作業メモなのでGitでは管理したくないものの、チームで使用する.gitignoreには追加したくないとします。この場合、.git/info/excludeに次のように記述します。
memo.txtこれで、memo.txtはgit statusなどに表示されなくなり、通常のgit addでも追加されなくなります。
.git/info/excludeの使い方
.git/info/excludeとは、特定のGitリポジトリだけで使用できる除外設定ファイルです。
Gitリポジトリを作成すると、通常は.gitディレクトリの中にinfo/excludeというファイルがあります。
.git/
└── info/
└── exclude.git/info/excludeを使用する方法は簡単です。Gitリポジトリのルートディレクトリで、.git/info/excludeをエディターなどで開きます。
初期状態では、次のようなコメントが記述されている場合があります。
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~このファイルの末尾に、無視したいファイルやディレクトリを追加します。
例えば、memo.txt、.vscodeディレクトリ、拡張子が.logのファイルを無視する場合は、次のように記述します。
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
memo.txt
.vscode/
*.logmemo.txt.vscodeディレクトリ- ディレクトリを無視する場合は、次のように末尾に
/を付けて記述できます。
- ディレクトリを無視する場合は、次のように末尾に
- 拡張子が
.logのファイル- 特定の拡張子を持つファイルをすべて無視する場合は、次のように記述します。
このように、ファイル名、ディレクトリ名、ワイルドカードなどを指定して除外できます。基本的な書き方は.gitignoreと同じです。
.git/info/excludeは.gitディレクトリの中にあるため、通常はGitの管理対象にはなりません。そのため、設定内容をコミットして他のメンバーと共有することなく、自分だけの除外設定として使用できます。
コマンドで.git/info/excludeに追加する
.git/info/excludeをエディターで直接開かなくても、コマンドを使って設定を追加できます。例えば、memo.txtを無視したい場合は、次のコマンドを実行します。
echo "memo.txt" >> .git/info/excludeこれで、.git/info/excludeの末尾にmemo.txtが追加されます。
同様に、.vscodeディレクトリを無視する場合は、次のコマンドを実行します。
echo ".vscode/" >> .git/info/excludeファイルが無視されているか確認する
設定後は、git statusを実行して確認できます。
git status除外したファイルがUntracked filesに表示されなくなっていれば、除外設定が有効になっています。
より詳しく「どの設定によって無視されているのか」を確認したい場合は、git check-ignoreコマンドを使用できます。例えば、memo.txtを確認する場合は次のコマンドを実行します。
git check-ignore -v memo.txt例えば、次のような結果が表示されます。
.git/info/exclude:7:memo.txt memo.txtこれは、.git/info/excludeの7行目に記述されているmemo.txtという設定によって、そのファイルが無視されていることを表しています。
.gitignoreと.git/info/excludeの違い
.gitignoreと.git/info/excludeは、どちらもGitで無視するファイルを指定するために使用しますが、主な違いは「設定を共有するかどうか」です。
| 比較項目 | .gitignore | .git/info/exclude |
| 主な用途 | チーム全体で無視するファイルを指定する | 自分だけ無視するファイルを指定する |
| 設定範囲 | 対象のリポジトリ | 対象のリポジトリ |
| Gitで管理 | できる | 通常は管理されない |
| 他のメンバーと共有 | できる | 基本的に共有されない |
| クローン後 | 設定が引き継がれる | 設定は引き継がれない |
例えば、node_modules/やビルドによって生成されるファイルなど、プロジェクトに参加する全員が無視すべきファイルは.gitignoreに記述するのが適しています。
一方、自分だけが使用するエディターの設定ファイルや、一時的な作業ファイルなどは.git/info/excludeに記述すると便利です。
.git/info/excludeはクローンすると引き継がれない
.git/info/excludeを使用するときに注意したいのが、リポジトリをクローンし直すと設定が引き継がれないことです。.git/info/excludeは各ローカルリポジトリの.gitディレクトリ内に存在するファイルです。
そのため、例えばリポジトリを削除して、もう一度git cloneした場合は、以前記述していた除外設定を再度設定する必要があります。複数のリポジトリで毎回同じファイルを無視したい場合は、後述するグローバルな除外設定を使用する方が便利です。
すべてのリポジトリでファイルを無視する方法
特定のリポジトリだけではなく、自分が使用するすべてのGitリポジトリで同じファイルを無視したい場合は、グローバルな除外設定を使用できます。
Gitでは、core.excludesFileという設定を使用して、ユーザー共通の除外ファイルを指定できます。
例えば、ホームディレクトリに.gitignore_globalというファイルを作成して使用する場合は、次のコマンドを実行します。
git config --global core.excludesFile ~/.gitignore_globalこのコマンドは、~/.gitignore_globalをcore.excludesFileとして使用するようにGitへ設定しています。
.gitignore_globalというファイル名に特別な意味があるわけではありません。core.excludesFileに指定するファイル名や保存場所は自由に決められます。
例えば、次のようなファイルを指定することもできます。
git config --global core.excludesFile ~/.config/git/my-ignoreこの場合は、~/.config/git/my-ignoreがグローバルな除外設定ファイルとして使用されます。つまり、ファイル名ではなく、core.excludesFileにどのファイルが指定されているかによって、Gitが使用する除外ファイルが決まります。
core.excludesFileに設定されているファイルを確認する
グローバル設定のcore.excludesFileにどのファイルが設定されているか確認する場合は、次のコマンドを実行します。
git config --global --get core.excludesFile例えば、次のように表示されたとします。
/home/user/.gitignore_globalこの場合は、グローバル設定のcore.excludesFileに/home/user/.gitignore_globalが指定されています。
さらに、どのGit設定ファイルにcore.excludesFileが設定されているのか確認したい場合は、次のコマンドを実行します。
git config --show-origin --get core.excludesFile例えば、次のように表示されます。
file:/home/user/.gitconfig /home/user/.gitignore_globalこれは、/home/user/.gitconfigにcore.excludesFileの設定があり、/home/user/.gitignore_globalが除外ファイルとして指定されていることを表しています。
なお、core.excludesFileを自分で設定していない場合は、git config --global --get core.excludesFileを実行しても何も表示されないことがあります。core.excludesFileを設定していない場合のグローバルな除外ファイルについては、後ほど詳しく説明します。
除外するファイルを設定する
core.excludesFileに指定したファイルには、.gitignoreと同じように無視したいファイルやディレクトリを記述します。
例えば、すべてのリポジトリでmemo.txt、.vscodeディレクトリ、拡張子が.logのファイルを無視する場合は、次のように記述します。
memo.txt
.vscode/
*.logこれで、自分の環境にあるGitリポジトリでmemo.txt、.vscodeディレクトリ、拡張子が.logのファイルが無視されるようになります。
core.excludesFileを設定していない場合
ここまで説明したように、core.excludesFileを使用すると、自分でグローバルな除外ファイルを指定できます。
一方、core.excludesFileを自分で設定していない場合でも、Gitにはデフォルトで使用するグローバルな除外ファイルがあります。
Git公式ドキュメントでは、グローバルな除外ファイルのデフォルトの場所として、次のパスが使用されます。
$XDG_CONFIG_HOME/git/ignoreXDG_CONFIG_HOMEとは、Linuxなどでユーザーごとの設定ファイルを保存するディレクトリを指定するための環境変数です。
簡単にいうと、「アプリケーションの設定ファイルをどこに保存するか」を表すための変数です。
例えば、XDG_CONFIG_HOMEに/home/user/.configが設定されている場合、$XDG_CONFIG_HOME/git/ignoreは実際には/home/user/.config/git/ignoreを表します。
つまり、XDG_CONFIG_HOMEはファイル名ではなく、設定ファイルを保存するための基準となるディレクトリを表しています。
XDG_CONFIG_HOMEが設定されていない場合
XDG_CONFIG_HOMEは、必ず設定されているわけではありません。Gitでは、XDG_CONFIG_HOMEが設定されていない、または空の場合、次のファイルをグローバルな除外ファイルとして使用します。
$HOME/.config/git/ignoreHOMEはユーザーのホームディレクトリを表す環境変数です。例えば、ホームディレクトリが/home/userの場合は、/home/user/.config/git/ignoreになります。
そのため、core.excludesFileを自分で設定していない場合、ホームディレクトリが/home/userであれば、基本的には/home/user/.config/git/ignoreがGitのグローバルな除外ファイルになります。
XDG_CONFIG_HOMEを確認する方法
現在のXDG_CONFIG_HOMEを確認する場合は、LinuxやmacOSでは次のコマンドを実行します。
echo $XDG_CONFIG_HOME例えば、/home/user/.configと表示された場合、Gitがデフォルトで使用するグローバルな除外ファイルは/home/user/.config/git/ignoreです。
一方、何も表示されなかった場合は、XDG_CONFIG_HOMEが設定されていない可能性があります。その場合、Gitでは$HOME/.config/git/ignoreが使用されます。
例えば、ホームディレクトリが/home/userの場合は、/home/user/.config/git/ignoreになります。
core.excludesFileを明示的に設定している場合は、デフォルトの$XDG_CONFIG_HOME/git/ignoreではなく、core.excludesFileに指定したファイルが使用されます。
.git/info/excludeとグローバル設定の使い分け
.git/info/excludeとグローバルな除外設定は、無視したい範囲によって使い分けるとわかりやすいです。
| 無視したい範囲 | 使用する設定 |
| チーム全員で無視したい | .gitignore |
| 特定のリポジトリで自分だけ無視したい | .git/info/exclude |
| 自分のすべてのリポジトリで無視したい | core.excludesFileで指定したファイル |
例えば、特定のプロジェクトだけで使用するmemo.txtを無視するのであれば、.git/info/excludeが適しています。一方、自分の環境ではどのリポジトリでも無視したいファイルであれば、グローバルな除外設定が適しています。
すでにGitで管理されているファイルには効かない
.git/info/excludeや.gitignoreなどの除外設定は、基本的にGitでまだ追跡されていないファイルを対象としています。そのため、すでにコミットされているファイルを.git/info/excludeへ追加しても、そのファイルがGitの管理対象から外れるわけではありません。
Gitの除外設定は、「現在追跡されていないファイルを今後Gitの管理対象にしない」ための仕組みと考えるとわかりやすいでしょう。
すでにGitで管理されているファイル自体を管理対象から外す場合は、git rm --cachedなどを使用してGitのインデックスから削除する必要があります。例えば、memo.txtをローカルには残したままGitの管理対象から外す場合は、次のコマンドを実行します。
git rm --cached memo.txtgit rm --cachedによる削除はGit上の変更として扱われるため、チームで管理しているファイルに対して自分だけ勝手に実行するのは適切ではありません。
「チームでは管理する必要があるけれど、自分のローカル変更だけ無視したい」という目的で.git/info/excludeを使用することはできないので注意しましょう。
本記事のまとめ
この記事では「.gitignoreを使わずにファイルを無視する方法」について、以下の内容を説明しました。
.git/info/excludeを使用すると、特定のリポジトリで自分だけの除外設定を作成できる.gitignore_globalというファイル名に決まりはなく、core.excludesFileに指定したファイルが使用されるcore.excludesFileはgit config --getや--show-originで確認できるXDG_CONFIG_HOMEはユーザーごとの設定ファイルを保存する基準ディレクトリを表す環境変数- すでにGitで管理されているファイルには、除外設定を追加しただけでは効かない
チーム全員で無視するファイルは.gitignore、特定のリポジトリで自分だけ無視したいファイルは.git/info/exclude、自分のすべてのリポジトリで無視したいファイルはグローバルな除外設定というように使い分けるとよいでしょう。
お読みいただきありがとうございました。