git config –show-originで設定の出どころを追う ― system・global・localの優先順位

Linux・CLI・DevOpsカテゴリを表すパンダのイラスト Linux・CLI・DevOps

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Git公式のgit-configと設定の優先順位を調べ、自分のGit設定を変更せずにlocalとcommandスコープを確認できるサンプルを作成しました。Gitコマンドの実機実行は未確認です。

検証ステータス:📘 Git公式仕様確認済み/Ubuntu実機未確認

Gitのコミット作成者が思っていた名前と違う、あるリポジトリだけユーザー名が違う、というときはgit config --get user.nameだけでは理由が分かりません。

Gitの設定にはsystem・global・localなどの適用範囲があり、設定が重複すると、どの場所から読み込まれたかが重要です。git config --show-origin --show-scopeを使うと、値と一緒に出どころも調べられます。

ただし、本物の設定一覧にはユーザーのメールアドレスや社内のプロキシが含まれる場合があります。今回は本物の個人設定を変更せず、一時的なGitリポジトリだけを使って観察します。

設定はどこから読み込まれるのか

Gitの代表的な設定場所は次のとおりです。

スコープ主な対象意味
systemマシン全体複数ユーザーに共通する設定
global利用者全体自分が使うGitの既定設定
localそのGitリポジトリ個別プロジェクトだけの設定
commandそのコマンドの実行git -cなどで一時上書き

一般的に狭いスコープの設定が広いスコープより優先されますが、同じキーが複数定義される場合や複数値が意味を持つ場合もあるため、必ず実際のキーを確認してください。

公式資料はGitの設定リファレンスです。

自分の設定を汚さず試す

次のシェルはGitのsystem/global設定を読まない設定を適用し、学習用の一時リポジトリだけを作成します。

#!/usr/bin/env bash

set -euo pipefail

temp_dir="$(mktemp -d)"
trap 'rm -rf -- "$temp_dir"' EXIT

export GIT_CONFIG_NOSYSTEM=1
export GIT_CONFIG_GLOBAL=/dev/null

git -C "$temp_dir" init -q
git -C "$temp_dir" config --local user.name "Sample Local"

echo "=== local setting ==="
git -C "$temp_dir" config --show-origin --show-scope --get user.name

echo "=== command-line override ==="
git -C "$temp_dir" -c user.name="Sample Override" \
  config --show-origin --show-scope --get user.name

mktemp -dで作った場所だけに.git/configを書き込みます。終了時にtrapが後片付けします。既存のリポジトリの設定を勝手に編集することはありません。

同じ内容のファイルはGitHubサンプル:Git設定のorigin・scopeに保存しています。

何を観察する?

期待結果のイメージは次のとおりです。実行する環境やGitのバージョンにより表示形式が変わる場合があります。

=== local setting ===
local  file:/tmp/.../.git/config  Sample Local

=== command-line override ===
command  command line:  Sample Override

最初はそのリポジトリに保存したSample Localが読み出されます。次の実行では-c user.name=...が指定した値を上書きし、コマンドライン由来であることが分かるはずです。

--show-originはどのファイルや場所から設定値を取得したか、--show-scopeは設定のスコープを表示するオプションです。スコープはGit 2.26以降の--show-scope対応版を前提にしています。

1か所変えて比較する

Sample OverrideをSample Anotherに書き換えて再実行します。

git -C "$temp_dir" -c user.name="Sample Another" \
  config --show-origin --show-scope --get user.name

コマンド引数を変更しても、.git/configに書き込まれたSample Localは変わりません。つまり、1回の実行だけを変える設定と、永続するリポジトリ設定は別物です。

もう一つの確認方法は、一時リポジトリでgit config --local --listを表示し、Sample Localが残っているかを見比べることです。

設定の優先順位とトラブルシューティング

実務でよくあるのは「コマンド結果がGitHubとローカルで違う」ケースです。例えばGitHub Actionsのチェックアウト後は、ローカルPCとは異なるHOME、システム設定、Gitバージョンが使われます。自分のPCとCIで結果が一致すると思い込まないようにします。

一方、CIでgit config --listをそのままログ出力するのは避けた方がよいでしょう。認証ヘルパー、ユーザー名、プロキシ、企業内パスなどが見えることがあります。

原因を調べる場合は対象キーを絞るのが基本です。

git config --show-origin --show-scope --get user.name
git config --show-origin --show-scope --get core.autocrlf

存在しない設定では終了コードが0以外になる場合があります。自動スクリプトではその場合を未設定として扱うのか、エラーとして扱うのかを決めます。未設定を黙って空文字にして続けると、意図しない既定値に気付けません。

また、--show-scopeに対応しない古いGitはオプションエラーになるので、git --versionを確認します。

本当に設定が変わったか、どこまで見る?

Gitの設定が違う原因を調べる順序として、対象リポジトリにいるか、どのキーを取得しているか、どのスコープが効いているか、CIやIDEから環境変数で上書きしていないかを確認します。

Gitの設定ファイルを手作業で変更する前に、読み取り専用の確認で出どころを把握するのが安全です。特に公開ブログへコマンド結果を貼るときは、実ユーザー名、メールアドレス、認証情報をダミーに置き換えてください。

公式情報

文書情報

記事タイトル
git config –show-originで設定の出どころを追う ― system・global・localの優先順位
作成日
更新日
Source URL
https://papanda925.com/?p=18097

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました