git-config 配置多用戶環境以及 includeIf用法
背景
開發人員經常遇到這樣的問題,公司倉庫和個人倉庫的用戶名和郵箱配置是有區別的,為了能夠很好地區分工程上傳到不同的遠程倉庫,我們需要分別處理,保證在不同的工程使用不同的賬戶
介紹
-
Git支持多級配置,分別是
system(系統級)
、global(用戶級)
、local(項目級)
和worktree(工作區級)
-
配置優先級:
worktree > local > global > system
-
在Linux環境中,分別對應
-
system
/etc/gitconfig
: 系統級配置文件;對系統中所有用戶都普遍適用的配置。使用git config --system
讀寫的就是這個文件。
-
global
~/.gitconfig
: 用戶級配置文件;用戶目錄下的配置文件只適用於該用戶。使用git config --global
讀寫的就是這個文件。
-
local
$RepoPath/.git/config
: 項目級配置文件;當前項目的 git倉庫目錄中的配置文件(也就是工作目錄中的.git/config
文件),這里的配置僅僅針對當前項目有效。使用git config --local
或 省略local參數
,讀寫的就是這個文件。
-
worktree
: 工作區級配置;此配置僅僅針對當前工作區有效。使用git config --worktree
進行配置。note
:- 每一個級別的配置都會覆蓋上層的相同配置,所以
.git/config
里的配置會覆蓋/etc/gitconfig
中的同名變量。 $RepoPath
為某倉庫的本地路徑
- 每一個級別的配置都會覆蓋上層的相同配置,所以
-
-
在 Windows 系統上
- Git 會找尋用戶主目錄下的
.gitconfig
文件。主目錄即$HOME變量
指定的目錄,一般都是C:\Documents and Settings\$USER
。此外,Git 還會嘗試找尋/etc/gitconfig
文件,只不過看當初 Git 裝在什么目錄,就以此作為根目錄來定位。
- Git 會找尋用戶主目錄下的
配置
-
常規用法
-
全局配置
-
方法一: 在
~/.gitconfig
文件中添加用戶名
和郵箱
-
方法二: 配置全局的
用戶名
和郵箱
git config --global user.email "you@example.com" git config --global user.name "Your Name"
-
-
項目倉庫配置
-
方法一: 在
$RepoPath/.git/config
文件中添加用戶名
和郵箱
-
方法二: 配置項目的
用戶名
和郵箱
# 進入 $RepoPath目錄,並執行 git config --local user.email "you@example.com" git config --local user.name "Your Name"
-
-
-
includeIf
用法可以在git的配置文件中使用
include
和includeIf
關鍵字來包含其它配置文件,git在解析配置文件時,會將被包含的配置文件的內容內聯到 包含指令 所在的位置;所以,被包含的配置文件的配置項會覆蓋包含指令之前的配置項,包含指令之后的配置項會覆蓋被包含的配置文件的配置項,即,優先級是:包含指令后面的配置項 > 被包含的配置文件的配置項 > 包含指令之前的配置項
;-
示例
[include] path = /path/to/foo.inc ; # 絕對路徑 path = foo.inc ; # 相對路徑,相對於當前的配置文件 path = ~/foo.inc ; # 相對用戶目錄 `$HOME` 路徑
-
gitdir
和gitdir/i
# 當倉庫所在目錄包含gitdir之后的路徑才會使用.inc文件 [includeIf "gitdir:/path/to/foo/.git"] path = /path/to/foo.inc # 所有倉庫目錄在gitdir之后的路徑下的,都會使用.inc文件 [includeIf "gitdir:/path/to/group/"] path = /path/to/foo.inc # 路徑描述也可以用定義過的環境變量代替 $HOME/to/group [includeIf "gitdir:~/to/group/"] path = /path/to/foo.inc
-
onbranch
# 包括只有當我們是在一個工作樹,其中 foo-branch 目前已核實 [includeIf "onbranch:foo-branch"] path = foo.inc
note:
- 在2017年,git新發布的版本2.13.0包含了一個新的功能includeIf配置,可以把匹配的路徑使用對應的配置用戶名和郵箱;
"條件類型:匹配模式"
是includeIf
的條件;只有當條件成立時,才會包含path
選項指定的配置文件;條件類型 和 匹配模式
用:
分隔;條件類型
共有以下幾種gitdir
、gitdir/i
、onbranch
;gitdir
、gitdir/i
: 路徑匹配模式,表示 如果 當前 git倉庫的.git 目錄
的位置 符合路徑匹配模式
, 就加載對應的配置文件;(gitdir/i
表示匹配模式
忽略大小寫)- .git 目錄的位置可能是 git 自動找到的 或是 $GIT_DIR 環境變量的值;
onbranch
: 分支匹配模式, 表示 如果我們位於當前檢出的分支名稱 與 分支匹配模式 匹配的工作樹中,就加載對應的配置文件;
匹配模式
采用標准的glob 通配符
再加上 表示任務路徑的通配符**
;path
用於指定配置文件的路徑;- 可以通過寫
多個 path
來表示包含多個配置
文件;
-
栗子
-
在用戶配置文件
~/.gitconfig
中添加以下內容-
指定工程的用戶配置
# 配置demo項目 [includeIf "gitdir/i:~/workspace/private/demo/.git"] path = ~/.gitconfig_self
-
指定目錄的用戶配置
# 配置public目錄 [includeIf "gitdir/i:~/workspace/public/"] path = ~/.gitconfig_work # 配置private目錄 [includeIf "gitdir/i:~/workspace/private/"] path = ~/.gitconfig_self
-
指定分支的用戶配置
# 配置 test-branch分支 [includeIf "onbranch:test-branch"] path = ~/.gitconfig_self
-
-
配置子配置文件
-
方法一: 直接在
$path
文件中添加用戶名
和郵箱
,如:[user] name = librarookie email = librarookie@163.com
-
方法二: 用
git config -f|--file
指定$path
文件的用戶名
和郵箱
git config -f $path user.name "Your Name"
git config -f $path user.email "you@example.com"git config -f ~/.gitconfig_self user.name librarookie git config -f ~/.gitconfig_self user.email librarookie@163.com
-
Ref