Git設定スコープ:グローバル、システム、リポジトリ固有設定の解説

Gitのシステム、グローバル、ローカル設定スコープ、その保存場所、および優先順位が設定に与える影響を理解します。

Git設定スコープ:グローバル、システム、リポジトリ固有設定の解説

Gitの設定スコープは、Gitが予期しない名前、メールアドレス、エディタ、マージツール、デフォルトブランチを使用する理由を説明します。同じキーが複数のファイルに存在する場合、より具体的なファイルが優先されます。

システム、グローバル、ローカル設定の保存場所を理解すれば、個人のデフォルトを設定しても、誤ってマシン上のすべてのリポジトリを変更することはありません。

Git設定の階層:優先順位

Gitは複数の場所から設定を読み取り、これらの場所は特定の優先順位で処理されます。同じ設定キーが複数のスコープで定義されている場合、より具体的なスコープの設定がより具体的でないスコープの設定を上書きします。この階層を理解することは、予測可能な動作のために重要です。

  1. リポジトリ固有(ローカル)設定: これらの設定は、特定のリポジトリの.git/configファイル内に保存されます。最も具体的であり、グローバル設定やシステム設定よりも優先されます。プロジェクト固有のルールに最適です。
  2. グローバル(ユーザー)設定: これらの設定は、マシン上の特定のユーザーアカウントに関連するすべてのリポジトリに適用されます。Linux/macOSでは~/.gitconfig、WindowsではC:\Users\<username>\.gitconfigファイルに保存されます。グローバル設定はシステム設定を上書きします。
  3. システムレベル設定: これらの設定は、特定のマシン上のすべてのユーザーとすべてのリポジトリに適用されます。通常、Linux/macOSでは/etc/gitconfig、WindowsではC:\Program Files\Git\etc\gitconfigにあります。システム設定は最も具体的ではなく、グローバル設定とローカル設定によって上書きされます。

注記: Gitはユーザーレベルの設定ファイルとして$XDG_CONFIG_HOME/git/configまたは~/.config/git/configを読み取ることもあります。そのファイルと~/.gitconfigの両方が存在する場合、Gitは両方を読み取ります。~/.gitconfigの値は通常、後で読み取られるため優先されます。

1. システムレベル設定(--system

システムレベル設定は最も広いスコープであり、特定のマシン上のすべてのGitユーザーとすべてのリポジトリに影響します。これらの設定は通常、マシン全体のデフォルトやシステム管理者が実施するポリシーに使用されます。

保存場所

  • Linux/macOS: /etc/gitconfig
  • Windows: C:\Program Files\Git\etc\gitconfig(インストールによってパスが異なる場合があります)

使用するタイミング

  • マシン全体のデフォルト: すべてのユーザーにデフォルトのcore.editorcolor.uiを設定する。
  • 会社全体のポリシー: 共有マシン上のすべての開発者が特定のGit動作に従うようにする。
  • セキュリティ設定: すべてのユーザーに対して特定の安全でない操作を無効にする。

実用的な例

すべてのシステムレベル設定を表示するには:

git config --system --list

システム全体のデフォルトユーザー名を設定するには(管理者権限が必要):

sudo git config --system user.name "Default Git User"

システム全体のデフォルトテキストエディタを設定するには:

sudo git config --system core.editor "nano"

警告: システムレベル設定の変更には管理者権限が必要であり、マシン上のすべてのGit使用に影響します。注意して、必要な場合にのみ使用してください。

2. グローバルレベル設定(--global

グローバル設定はユーザー固有であり、特定のマシン上のユーザーアカウントで操作するすべてのGitリポジトリに適用されます。これは個人設定で最も一般的なスコープです。

保存場所

  • Linux/macOS: ~/.gitconfig
  • Windows: C:\Users\<username>\.gitconfig

使用するタイミング

  • 個人のID: すべてのコミットでデフォルトで使用されるuser.nameuser.emailを設定する。
  • 好みのエイリアス: 頻繁に使用するGitコマンドのショートカットを定義する。
  • デフォルトのUI設定: color.uiautoに設定したり、好みのテキストエディタ(core.editor)を設定する。
  • デフォルトのブランチ動作: 例えば、pull.rebase

実用的な例

すべてのグローバルレベル設定を表示するには:

git config --global --list

グローバルユーザー名とメールアドレスを設定するには(すべてのGitユーザーに強く推奨される最初のステップ):

git config --global user.name "Your Name"
git config --global user.email "[email protected]"

git statusのグローバルエイリアスを作成するには:

git config --global alias.st "status"

これでgit stと入力するだけでgit statusが実行できます。

好みのエディタを設定するには:

git config --global core.editor "code --wait"

これにより、コミットメッセージなどのGit操作でVS Codeがデフォルトエディタとして設定されます。

ヒント: コミットが正しく帰属されるように、早い段階でグローバルのuser.nameuser.emailを設定してください。

3. リポジトリ固有(ローカル)設定

リポジトリ固有、またはローカル設定は最も細かい粒度です。これらの設定は、現在作業している特定のGitリポジトリにのみ適用されます。単一プロジェクトの固有の要件に合わせてGitの動作を調整するために重要です。

保存場所

  • Gitリポジトリのルートディレクトリ内の.git/configファイル内。

使用するタイミング

  • プロジェクト固有のID: 仕事のプロジェクトと個人のプロジェクトで異なるメールアドレスを使用する(例:仕事は[email protected]、個人は[email protected])。
  • プロジェクト固有のフック: リポジトリ固有のpre-commitpost-mergeフックを設定する。
  • リモートURL: 複数のリモートや特定のプッシュ/プルURLを定義する。
  • ブランチ固有の設定: 例えば、branch.<name>.remotebranch.<name>.mergeを設定する。
  • コア設定: コーディング標準に基づいて特定のプロジェクトにcore.autocrlfcore.whitespaceを設定する。

実用的な例

まずリポジトリのルートディレクトリに移動します。

すべてのローカルレベル設定(および継承されたグローバル/システム設定)を表示するには:

git config --list

グローバルメールアドレスを上書きするプロジェクト固有のメールアドレスを設定するには:

git config user.email "[email protected]"

特定のプロジェクトでgit fetchまたはgit pull中に受信したオブジェクトを検証するには:

git config fetch.fsckObjects true

このプロジェクトに固有のローカルエイリアスを設定するには(例:複雑なプロジェクト固有のコマンドの場合):

git config alias.log-compact "log --pretty=oneline --abbrev-commit --graph"

ベストプラクティス: 他のリポジトリに影響を与えるべきでない設定にはローカル設定を使用してください。これにより、グローバル設定がクリーンに保たれ、関連のないプロジェクトへの偶発的な影響を防げます。

設定の表示

--list以外にも、個別の設定キーを確認したり、スコープを直接指定したりできます。

すべての設定の表示(--list

現在のコンテキストに適用されるすべての設定(システム、グローバル、ローカル設定を含む)と、優先順位に基づいてどのように解決されるかを確認するには:

git config --list --show-origin

このコマンドは、キーと値のペアだけでなく、各設定の元のファイルも表示するため非常に便利です。これにより、どの設定が優先されているかわからない場合のデバッグに大いに役立ちます。

特定のキーの表示

特定の設定キー(例:user.name)の値を確認するには:

git config user.name

Gitは階層に従って解決された有効な値を返します。

特定のスコープでの特定のキーの値を確認するには:

git config --global user.name # グローバルのuser.nameのみ表示
git config --system core.editor # システムのcore.editorのみ表示

競合と優先順位の解決

Gitが競合をどのように解決するかを理解することは、予期しない動作のトラブルシューティングの鍵です。リポジトリ内でgit config --listを実行すると、Gitは有効な設定を表示します。user.emailがグローバルとローカルの両方で設定されている場合、ローカル設定が優先されるため表示されます。

例で説明します:

  1. システム: /etc/gitconfiguser.name = "System Default User"
  2. グローバル: ~/.gitconfiguser.name = "My Global Name"user.email = "[email protected]"
  3. ローカル: .git/configuser.name = "Project Specific User"user.email = "[email protected]"

ローカルリポジトリ内でgit config --listを実行すると、次のように表示されます:

  • user.name=Project Specific User(ローカルがグローバルを上書きし、グローバルがシステムを上書き)
  • [email protected](ローカルがグローバルを上書き)

ローカルリポジトリにuser.nameが設定されていない場合、git config user.nameMy Global Nameを返します。

このカスケード効果により、非常に柔軟性が高まります。一般的な設定はグローバルに設定し、プロジェクトレベルで必要なものだけを上書きすることで、グローバル環境をクリーンに保ち、プロジェクト環境を調整できます。

実用的なユースケースとベストプラクティス

  • ユーザーID: 常にグローバルのuser.nameuser.emailを設定してください。プロジェクトの要件で異なるアドレスが必要な場合(例:仕事用と個人用アカウント)のみ、ローカルでuser.emailを上書きします。
  • エイリアス: 一般的なエイリアス(ststatusに、cocheckoutに、brbranchに)はグローバルに定義して個人の生産性を高めます。ローカルエイリアスは、非常にプロジェクト固有で複雑なコマンドにのみ使用します。
  • フック: すべてのリポジトリに適用したい一般的なユーティリティフック(例:簡単なフォーマットチェック)はグローバルに保存します。複雑でプロジェクト固有のCI/CD統合やコードスタイルの強制には、プロジェクトのコントリビューターが管理するローカルリポジトリフックを使用します。
  • エディタ: core.editorをグローバルにお気に入りのテキストエディタに設定します。これにより、コミットメッセージやリベース指示など、すべての作業でGitが好みのツールを使用するようになります。
  • 空白と改行コード: core.autocrlfcore.whitespaceは一般的な設定項目です。これらをグローバルに設定すればほとんどの場合十分ですが、厳格または珍しい規則がある特定のプロジェクト(例:Linux上でCRLFのみを使用する古いプロジェクト)では、ローカルでの上書きが必要になる場合があります。

最終的なポイント

通常のIDと設定にはグローバル設定を、プロジェクト固有のルールにはローカル設定を、マシン全体のデフォルトが必要な場合のみシステム設定を使用してください。Gitが予期しない動作をした場合、git config --list --show-originが原因のファイルを最も速く見つける方法です。