Git ファイルの無視: .gitignore、.git/info/exclude、およびグローバルな無視の使用方法
Git は、プロジェクトレベル、リポジトリローカルレベル、およびユーザーグローバルレベルの 3 つの異なるレベルでファイルを無視することを許可します。この階層的なアプローチにより、開発者は共有プロジェクトの要件を、個人のワークフローの好みやマシン固有の OS のノイズから分離できます。
プロジェクトレベルでの無視: .gitignore
.gitignore は、すべての貢献者に対してリポジトリから除外されるべきファイルを無視するための標準的な方法です。このファイルはバージョン管理にチェックインされるため、追加されたパターンはリポジトリをクローンするすべての人に適用されます。
このファイルは以下に最適です:
- ビルド出力 (例:
/dist,/bin) - 依存関係フォルダ (例:
node_modules/) - プロジェクト固有の一時ファイル
リポジトリローカルでの無視: .git/info/exclude
特定のプロジェクトにおいて無視する必要があるが、他の共同作業者と共有すべきではないファイルについては、Git は .git/info/exclude ファイルを提供しています。このファイルは .git ディレクトリ内に存在し、バージョン管理の対象外です。
これは、個人のメモ、ローカル専用のスクリプト、または単一のプロジェクト内での特定の開発者のワークフローに固有のカスタム Makefile に最適です。ある貢献者は次のように述べています:
.git/info/excludeをめちゃくちゃ使い倒しています。ローカルだけで使いたいスクリプトや Makefile で、共同作業者は気にしないし、使うこともできないようなものには最高です。
ユーザーグローバルでの無視: ~/.config/git/ignore
マシン上のすべての Git リポジトリでファイルを無視するには、開発者はグローバルな無視ファイルを使用できます。デフォルトでは、これは ~/.config/git/ignore に配置されます。
グローバルな無視は、macOS の .DS_Store のように、すべてのプロジェクトに現れる OS 固有のファイルや IDE の設定に最も効果的です。グローバルな無視を使用することで、これらのファイルがプロジェクトレベルの .gitignore ファイルを散らかすのを防ぐことができます。
グローバルな無視パスのカスタマイズ
デフォルト以外の好ましい場所を指定したい場合は、次のコマンドを使用してグローバルな無視ファイルをカスタマイズできます:
git config --global core.excludesFile ~/.gitignore_global
デフォルトの設定に戻すには、次のように実行します:
git config --global --unset core.excludesFile
Git の用語では、--global はシステム全体ではなく、現在のユーザーの設定を指すことに注意してください。システム全体の構成は、通常 /etc に配置されます。
git check-ignore による無視されたファイルのデバッグ
複数の無視ファイルが有効な場合、どのファイルが特定のファイルを排除する原因となっているかを判断するのが難しいことがあります。git check-ignore -v コマンドは、無視の原因となっている正確なファイルと行番号を特定します。
出力例:
- プロジェクトレベル:
.gitignore:1:.DS_Store .DS_Store - ローカルレベル:
.git/info/exclude:7:.DS_Store .DS_Store - グローバルレベル:
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
ファイルが無視されていない場合は、コマンドは何も出力しません。
高度な代替案と補足
標準的な無視方法以外にも、Git はファイルノイズや設定を管理するための他のツールを提供しています:
.gitattributes による Diff の抑制
.gitignore はファイルが追跡されるのを防ぎますが、.gitattributes は追跡されているファイルの diff を無視するために使用できます。例えば、.gitattributes ファイルに package-lock.json -diff を追加すると、そのファイルをコミットすることはできますが、git diff 操作中にその巨大で、しばしばノイズとなる diff を隠すことができます。
リモート固有の設定
Git は設定ファイル内での条件付き include をサポートしており、リモート URL またはリポジトリのディレクトリ位置に基づいて異なる設定をを使用することができます。これにより、ワークと個人プロジェクトで異なるメールアドレスや設定を管理することが便利です。
バイナリファイルのための Pre-commit Hooks
バイナリファイルや特定のサイズを超えるファイルをブロックするために、一部の開発者は、無視ファイルだけに頼るのではなく、グローバルな hooks ディレクトリ (git config --global core.hooksPath ~/.config/git/hooks) を使用して pre-commit チェックを実装することを推奨しています。