Gitを使っていると、次のようなコマンドを見かけることがある。
git config --global user.name "Your Name"
git config --global user.email "your@example.com"
また、Git Aliasを設定するときにも、
git config --global alias.st status
のようにgit configを使用する。
では、
-
git configとは何なのか -
.gitconfigとは何なのか -
--globalとは何なのか -
local / global / systemは何が違うのか
を整理する。
まず結論
Gitには、
Gitの動作やユーザー情報などを保存する「設定」がある。
その設定を操作するコマンドが、
git config
である。
そして設定には主に、
system
↓
global
↓
local
という3つのスコープがある。
簡単に言えば、
system
PC全体
global
そのユーザー全体
local
そのGitリポジトリだけ
という違いである。
git configとは?
git configとは、
Gitの設定を確認・追加・変更するためのコマンド
である。
Gitにはさまざまな設定が存在する。
例えば、
ユーザー名
メールアドレス
Git Alias
デフォルトブランチ
エディタ
改行コード関連
認証関連
などである。
例えばGitで使用するユーザー名を設定するなら、
git config --global user.name "Taro"
とする。
メールアドレスなら、
git config --global user.email "taro@example.com"
となる。
つまり、
git config
│
└─ Gitの設定を操作するコマンド
と考えればよい。
.gitconfigとは?
.gitconfigとは、
Gitの設定を保存する設定ファイル
である。
例えば、
git config --global user.name "Taro"
git config --global user.email "taro@example.com"
git config --global alias.st status
と設定すると、ユーザー単位のGit設定ファイルには概念的に次のような内容が保存される。
[user]
name = Taro
email = taro@example.com
[alias]
st = status
つまり、
git config
↓
設定を変更する
.gitconfig
↓
設定内容を保存する
という関係である。
ここは、
git config= コマンド
.gitconfig= 設定ファイル
と区別すると分かりやすい。
.gitconfigの「.」は何?
.gitconfigの先頭には、
.
が付いている。
Unix/Linux系の環境では、名前が.から始まるファイルは通常、隠しファイルとして扱われる。
例えば、
.gitconfig
.bashrc
.zshrc
などがある。
そのため.gitconfigは、
Gitの設定を保存している隠し設定ファイル
という位置づけになる。
WindowsでもGitのユーザー設定として同様のファイルが利用される。
Gitの設定にはスコープがある
ここが重要である。
Gitの設定は、すべて一つの場所に保存されているわけではない。
主に、
system
global
local
という3つのスコープが存在する。
イメージすると、
PC
│
├── system
│ └── PC全体
│
├── User A
│ └── global
│ └── User A全体
│
└── Git Repository
└── local
└── このリポジトリだけ
となる。
systemとは?
systemは、
そのPC・システム全体に適用されるGit設定
である。
設定する場合は、
git config --system...
とする。
例えば、
git config --system core.autocrlf true
のような形である。
system設定は、そのマシンを使用する複数ユーザーに影響する可能性がある。
そのため、通常の個人利用で頻繁に変更するものではない。
権限によっては管理者権限が必要になる。
globalとは?
globalは、
現在のユーザー全体に適用されるGit設定
である。
例えば、
git config --global user.name "Taro"
とすると、そのユーザーが扱うGitリポジトリで基本的にこの設定が使われる。
よく設定するものとして、
git config --global user.name "Taro"
git config --global user.email "taro@example.com"
がある。
Git Aliasも、
git config --global alias.st status
としてglobalに設定することが多い。
なぜなら、
git st
を特定のリポジトリだけではなく、普段使うさまざまなリポジトリで利用したいからである。
localとは?
localは、
現在のGitリポジトリだけに適用される設定
である。
例えば、
git config --local user.email "work@example.com"
とすると、そのリポジトリだけで、
work@example.com
というメールアドレスを使用できる。
--localは省略することもできる。
Gitリポジトリ内で、
git config user.email "work@example.com"
と設定すれば、基本的にはlocal設定として扱われる。
local設定はリポジトリ内の、
.git/config
に保存される。
ここはglobalとの違いとして重要である。
global
↓
ユーザーのGit設定ファイル
例:~/.gitconfig
local
↓
そのリポジトリの設定ファイル
.git/config
localはどんなときに使う?
例えば、
個人開発
↓
personal@example.com
仕事
↓
work@example.com
のようにGitのメールアドレスを使い分けたい場合がある。
普段は、
git config --global user.email "personal@example.com"
としておく。
仕事用リポジトリだけ、
git config --local user.email "work@example.com"
と設定する。
すると、
global
personal@example.com
│
├── 個人Repository A
│ → personal@example.com
│
├── 個人Repository B
│ → personal@example.com
│
└── 仕事Repository
│
└── local
work@example.com
という使い分けができる。
system・global・localが全部設定されていたら?
ここで疑問になるのが、
同じ設定がsystem・global・localすべてに存在したらどうなるのか?
という点である。
基本的には、より限定的な設定が優先される。
local
↑
global
↑
system
つまり、
local > global > system
と考えればよい。
なぜlocalの方が強いのか?
例えばsystemで、
user.name = SystemUser
globalで、
user.name = Taro
localで、
user.name = WorkTaro
となっていたとする。
このリポジトリでは、
WorkTaro
が使われる。
理由はlocal設定が、
このリポジトリでは、この設定を使いたい
という、より具体的な指定だからである。
考え方としては、
system
「このPCではこれを使う」
↓
global
「でも、このユーザーではこれを使う」
↓
local
「でも、このRepositoryではこれを使う」
となる。
対象範囲が狭い設定ほど、その場所に対して具体的な指定になるため、優先される。
実際にどの設定が使われているか確認する
例えば現在のユーザー名を確認するなら、
git config user.name
メールアドレスなら、
git config user.email
とする。
すべての設定を見るなら、
git config --list
を使える。
「どのファイルから来た設定なのか」も確認できる
設定が増えてくると、
この
user.email、globalなのかlocalなのか分からない
ということがある。
その場合、
git config --list --show-origin
とすると、設定値だけでなく、その設定がどこから読み込まれたのか確認できる。
イメージとしては、
file:/home/user/.gitconfig user.name=Taro
file:/home/user/.gitconfig user.email=personal@example.com
file:.git/config user.email=work@example.com
のようになる。
この場合、
global
personal@example.com
↓ localで上書き
local
work@example.com
となっていることが分かる。
設定トラブルを調べるときに便利なコマンドである。
Git Aliasも同じ仕組み
前の記事で扱ったGit Aliasも、実はこのGit Configの仕組みを利用している。
例えば、
git config --global alias.st status
は、
global設定として
alias.st = status
を登録する
という意味である。
ユーザーのGit設定を見ると、
[alias]
st = status
のような設定になっている。
つまりGit Aliasだけ特別な仕組みが存在するわけではない。
Git Config
│
├── user.name
├── user.email
├── core.editor
├── alias.st
├── alias.co
└── その他多数
というGit設定の一つとしてAliasも存在している。
.gitと.gitconfigは違う
名前が似ているので注意したい。
.gitconfig
.git/
は別物である。
.gitconfigは、
Gitの設定ファイル
である。
一方、
.git/
は、
そのディレクトリをGitリポジトリとして管理するための情報を保存する場所
である。
例えば、
my-project/
│
├── src/
├── README.md
│
└── .git/
├── config
├── HEAD
├── objects/
└── refs/
のようになっている。
そしてlocal設定は、
.git/config
に保存される。
整理すると、
.gitconfig
│
└── 主にユーザー単位のGit設定
.git/
│
├── Gitリポジトリそのものの管理情報
│
└── config
└── このRepositoryのlocal設定
となる。
全体をつなげる
ここまでを一つにつなげると、Gitの設定は次のような構造になっている。
Git
│
├── git config
│ │
│ └── Gitの設定を操作するコマンド
│
└── Configuration
│
├── system
│ └── PC・システム全体
│
├── global
│ └── ユーザー全体
│ └── ~/.gitconfig など
│
└── local
└── Repository単位
└── .git/config
そして同じ設定が複数存在する場合は、基本的に、
local
↓ 優先
global
↓
system
となる。
まとめ
git configとは、
Gitの設定を操作するためのコマンド
である。
.gitconfigとは、
Gitの設定を保存する設定ファイル
である。
さらにGitの設定には主に3つのスコープがある。
| スコープ | 対象 | 代表的な用途 |
|---|---|---|
system |
システム・PC全体 | マシン共通設定 |
global |
ユーザー全体 | 名前、メール、Aliasなど |
local |
特定のRepository | プロジェクト固有設定 |
優先順位は基本的に、
local > global > system
となる。
例えば、
git config --global alias.st status
というコマンドも、
git config
↓
Gitの設定を変更
↓
--global
↓
ユーザー全体を対象にする
↓
alias.st
↓
stというAliasの設定
↓
status
↓
設定する値
と分解すると理解しやすい。
Git Alias、ユーザー名、メールアドレスなどはバラバラの機能に見えるが、実際には、
Gitが持っているConfiguration(設定)の仕組みを
git configから操作している
という一つの仕組みにつながっている。