gitconfigについて、押さえておきたい内容をまとめました。
具体的には、system, global, localの違いに関する内容になっています。
gitconfigのレベル
gitconfigには、system, global, localの大きく分けて3つのレベルがあります。
それぞれの基本的な情報は以下の通り。
適用範囲 | 設定ファイルの場所 | 設定コマンド(git config)のオプション | |
---|---|---|---|
system | システム上の全ユーザーの全リポジトリ | /etc/gitconfig | --system |
global | 使用ユーザー | ~/.gitconfigまたは~/.config/git/config | --global |
local | 設定したリポジトリ | .git/config(設定したリポジトリ内) | --localまたはなし |
補足事項
上記だけではわかりにくい箇所もあるので、いくつか補足事項を。
globalは、git config --globalの設定をしたユーザーを使用している時に適用されます。
localは、設定をしたリポジトリで適用されます。
後続の「優先順位」にも関連しますが、操作しているリポジトリで、.git/configに設定があった場合、どのユーザーで操作をしてもその値が適用されます。
localは、オプションなしで設定ができますが、Git管理化していないディレクトリで実行するとエラーになるので、注意しましょう。
優先順位
優先順位は、system < global < localです。
公式サイトの8.1 Git のカスタマイズ - Git の設定によれば、/etc/gitconfig(systemの設定ファイル) → ~/.configまたは~/.config/git/config(globalの設定ファイル), 使用中のリポジトリの設定ファイル(.git/config:localの設定ファイル)の順に読み込まれ、後から読んだ値がその前の値を上書く、すなわち、優先されるとあります。
試しに、とあるユーザーで、system, globalを設定し、localの設定をしたリポジトリで設定状況を見てみましょう。
git configに、--listを付けて実行します。
$ git config --list
# system(/etc/gitconfig)の設定値
user.name=hoge
user.email=hoge@example.com
# global(~/.config)の設定値
user.name=fuga
user.email=fuga@example.com
# local(.git/config)の設定値
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=piyo
user.email=piyo@example.com
実際は出力されませんが、分かりやすくするため、「#」でコメントを入れました。
この設定だと、複数あるuser.nameとuser.emailは、一番下(後)に表示されている(読み込まれている)user.name=piyo, user.email=piyo@example.comが優先されます。
今手を加えているリポジトリで適用される設定を知りたい場合は、このgit config --listを使って確認するとよいですね。
なお、gitのcオプション(-c)を使えば、そちらで指定された値が適用されます(設定ファイルの値を上書きます)。
gitのcオプション(-c)も加味すると、優先順位は、
system < global < local < gitのcオプション(-c)
となりますね。
実行コマンド
以下に、各々の設定時の実行コマンドの例を挙げてみました。
user.nameと、user.emailを設定する内容にしています。
※git -cのみ、コミット時のコマンドにしています。
-- system
git config --system user.name "hoge"
git config --system user.email hoge@example.com
-- global
git config --global user.name "fuga"
git config --global user.email fuga@example.com
-- local
git config --local user.name "piyo"
git config --local user.email piyo@example.com
-- git -c
git -c user.name="bar" -c user.email=bar@example.com commit -m "test"
使い分けについて
system
システム上の全ユーザーの全リポジトリに適用されるが、最も優先度の低くなるsystem。
使うとしたら、以下のような場合でしょうか。
- システム全体で、Git用ユーザーを統一したい場合
- 所謂ゲストユーザーでGitを使用する場合
前者はあまりなさそうですが、後者ならありえそう??
ユーザーのgitconfigの設定(global)がない状態で、コミットしようとするとエラーになるので、それを防ぐための応急処置策としてよさそうです。
global
最もメジャーな設定ですね。
- 個人用PCのメインGitアカウント
- サーバのアカウントを個別で付与されている場合
個別のアカウントが割り当てられているなら、とりあえずはこの設定をしておけばよいでしょう。
local
localは以下の通りでしょうか。
- 個人用PCのサブGitアカウント
- 共用のサーバアカウントを使っていて、サーバ上に個人環境を構築する場合
メジャーなのは前者ですかね。複数のアカウントを使い分けている場合に使えそうです。
後者は現場にもよると思いますが、該当するなら、対象のGitリポジトリにlocal設定を行うとよいですね。
git -c
最後に、いちばん優先度の高いgit -c。
こちらは使うとしたら、以下のような場合でしょうか。
- 普段はデプロイだけのサーバで少しだけ修正したい場合
- 他者の個人環境にて、手を加える場合
使用頻度は低そうですが、覚えておくと、いざという時に便利。
終わりに
普段あまり気にすることではないけれど、だれが編集したのか?正確に把握するためにも、正しく設定を使い分けたいところ。
参考
- 1.6 使い始める - 最初のGitの構成 | git
- 8.1 Git のカスタマイズ - Git の設定 | git
- git-config Documentation | git
- git Documentation | git
特に使い分けについては、以下の記事を大いに参考にさせていただきました!