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