[Git]これだけ押さえる！gitconfigの基本

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 の設定](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)によれば、/etc/gitconfig(systemの設定ファイル） → ~/.configまたは~/.config/git/config（globalの設定ファイル）, 使用中のリポジトリの設定ファイル（.git/config：localの設定ファイル）の順に読み込まれ、後から読んだ値がその前の値を上書く、すなわち、優先されるとあります。

試しに、とあるユーザーで、system, globalを設定し、localの設定をしたリポジトリで設定状況を見てみましょう。
git configに、--listを付けて実行します。

```sh
$ 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](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90)
* [8.1 Git のカスタマイズ - Git の設定 | git](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A)
* [git-config Documentation | git](https://git-scm.com/docs/git-config)
* [git Documentation | git](https://git-scm.com/docs/git)

特に使い分けについては、以下の記事を大いに参考にさせていただきました！

* [名前やメールアドレスを一時的に指定して git commit する方法 | Qiita](https://qiita.com/megane42/items/5375b54ea3570506e296)
* [複数のgitアカウントを使い分ける | Qiita](https://qiita.com/0084ken/items/f4a8b0fbff135a987fea)