git支持多級配置,如:系統級、用戶級、項目級、工作區級;但是不支持目錄級的配置(即:對指定目錄下的所有git項目都生效的配置),所以就沒有很好的辦法實現給某個目錄下的所有git項目設置統一的配置;為了解決這個問題,我研究了git的相關幫助文檔,終于找到了我認為還算完美的解決方案,也順便解決了分支級配置的解決方案;本文就詳解這個解決方案以及其中的細節。
目錄
內容
1. 問題背景
1.1. 目錄級配置場景
在用git進行提交時需要提交者的 姓名 和 郵箱,然而,我們通常有兩個郵箱,一個是個人的個人郵箱,一個是上班時的工作郵箱;當一臺電腦上即有個人項目 又有 公司項目時,我們需要分別為每個公司(或個人)項目設置郵箱,這很不方便;
1.2. 分支級配置場景
有些項目需要開源,但開源的部分需要經過處理,一種方案是為開源創建一個單獨的分支,比如分支名就叫 開源
,該分支的遠程倉庫跟內部使用的不一樣,所以開源這個分支往往需要一些特殊的配置,比如提交者姓名、郵箱、Git的推送、拉策等;
如果就一個這樣的項目,我們可以單獨進行配置,但是如果有很多這樣的項目再單獨配置的話就很麻煩,也容易遺漏掉某些配置;
2. 解決思路
在用戶級 或 系統級 配置文件中 通過 includeIf
配置項來有條件地加載指定配置文件;這個條件可以根據 當前git項目的目錄 來設置,也可以根據當前git項目的當前Git分支來設置;這樣就能實現針對不同的git倉庫 或 分支 來加載不同的配置。
3. 解決方案
- 在 用戶級配置文件
~/.gitconfig
(推薦 用戶級配置) 或 系統級配置文件/etc/gitconfig
中的最下面,根據需求,加入以下任意一個或多個配置模板:- 根據git項目的目錄來加載對應的配置文件:當 當前 git倉庫的目錄 符合
~/**/某類別的目錄/**
時,就加載配置文件對應的配置文件/的路徑/gitconfig_category
[includeIf "gitdir:~/**/某類別的目錄/**"] path = 對應的配置文件/的路徑/gitconfig_category
- 根據git項目的目錄來加載對應的配置文件:當 當前 git倉庫的目錄 在不區別大小寫的情 況下 符合
~/**/某類別的目錄/**
時,就加載配置文件對應的配置文件/的路徑/gitconfig_category
[includeIf "gitdir/i:~/**/某類別的目錄/**"] path = 對應的配置文件/的路徑/gitconfig_category
- 根據分支來加載對應的配置文件:如果我們位于當前檢出的分支名稱與模式匹配的工作樹 中,就加載配置文件
對應的配置文件/的路徑/gitconfig_category
[includeIf "onbranch:分支名字"] path = 對應的配置文件/的路徑/gitconfig_category
- 根據git項目的目錄來加載對應的配置文件:當 當前 git倉庫的目錄 符合
- 在配置文件
對應的配置文件/的路徑/gitconfig_category
中編寫你需要設置,或 通過 帶-f|--file
選項 config 命令git config -f 配置文件路徑
直接將配置項寫入指定配置文件中,如:- 直接在配置文件插入相應的配置項:
[user] email = guobinyong@qq.com
- 通過 config 命令直接將配置項寫入指定配置文件中:
git config -f 對應的配置文件/的路徑/gitconfig_category user.email guobinyong@qq.com
- 直接在配置文件插入相應的配置項:
4. 相關內容詳解
4.1. include 和 includeIf
可以在git的配置文件中使用 include
和 includeIf
關鍵字來包含其它配置文件,git在解析配置文件時,會將被包含的配置文件的內容內聯到 包含指令 所在的位置;所以,被包含的配置文件的配置項會覆蓋包含指令之前的配置項,包含指令之后的配置項會覆蓋被包含的配置文件的配置項,即,優先級是:包含指令后面的配置項 > 被包含的配置文件的配置項 > 包含指令之前的配置項
;
官方文檔請參閱:includes配置項
4.1.1. include
包含指定的一個或多個配置文件;
示例:
[include]
path = /path/to/foo.inc ; 絕對路徑
path = foo.inc ; 相對路徑,相對于當前的配置文件
path = ~/foo.inc ; 相對用戶目錄 `$HOME` 路徑
說明:
-
path
用于指定配置文件的路徑; - 可以通過寫多個
path
來表示包含多個配置文件;
4.1.2. includeIf
includeIf
指令可指定包含的條件,只有當條件成立時,才會包含指定的配置文件;
語法:
[includeIf "條件類型:匹配模式"]
path = 某類別/對應的配置文件1/的路徑
path = 某類別/對應的配置文件2/的路徑
說明:
-
"條件類型:匹配模式"
是includeIf
的條件;只有當條件成立時,才會包含path
選項指定的配置文件; -
條件類型
和匹配模式
用:
分隔; -
條件類型
共有以下幾種gitdir
、gitdir/i
、onbranch
-
匹配模式
采用標準的glob
通配符 再加上 表示任務路徑的通配符**
-
path
用于指定配置文件的路徑; - 可以通過寫多個
path
來表示包含多個配置文件;
條件類型:
-
gitdir:路徑匹配模式
:表示 如果 當前 git倉庫的.git
目錄的位置 符合路徑匹配模式
,就加載對應的配置文件;.git
目錄的位置可能是 git 自動找到的 或是$GIT_DIR
環境變量的值; -
gitdir/i
:表示 在忽略大小寫的情況下,如果 當前 git倉庫的.git
目錄的位置 符合路徑匹配模式
,就加載對應的配置文件;.git
目錄的位置可能是 git 自動找到的 或是$GIT_DIR
環境變量的值; -
onbranc:分支匹配模式
:表示 如果我們位于當前檢出的分支名稱 與分支匹配模式
匹配的工作樹中,就加載對應的配置文件;
示例:
# 當 當前 git倉庫的目錄 符合 `~/**/某類別的目錄/**` 時,就加載對應的配置文件
[includeIf "gitdir:~/**/某類別的目錄/**"]
path = 某類別/對應的配置文件1/的路徑
path = 某類別/對應的配置文件2/的路徑
# 當 當前 git倉庫的目錄 在不區別大小寫的情況下 符合 `~/**/某類別的目錄/**` 時,就加載對應的配置文件
[includeIf "gitdir/i:~/**/某類別的目錄/**"]
path = 某類別/對應的配置文件1/的路徑
path = 某類別/對應的配置文件2/的路徑
# 如果我們位于當前檢出的分支名稱與模式匹配的工作樹中,就加載對應的配置文件
[includeIf "onbranch:分支名字"]
path = 對應的配置文件1/的路徑
path = 對應的配置文件2/的路徑
4.2. 多級配置
git支持多級配置,如:系統級、用戶級、項目級、工作區級;它們的優先級如下:工作區級配置 > 項目級配置 > 用戶級配置 > 系統級配置
;每級配置記錄在對應的配置文件中,通過 git config
命令設置的配置項 也都會寫在對應的配置文件中,配置文件的具體信息如下:
-
/etc/gitconfig
:系統級配置文件;對系統中所有用戶都普遍適用的配置。若使用git config
時用--system
選項,讀寫的就是這個文件。 -
~/.gitconfig
:用戶級配置文件;用戶目錄下的配置文件只適用于該用戶。若使用git config
時用--global
選項,讀寫的就是這個文件。 - 當前項目的 git倉庫目錄中的配置文件(也就是工作目錄中的
.git/config
文件):這里的配置僅僅針對當前項目有效。若使用git config
時用--local
選項 或 省略,讀寫的就是這個文件。 - 工作區級配置文件 :這里的配置僅僅針對當前工作區有效。若使用
git config
時用--worktree
選項,讀寫的就是這個文件。
4.3. 通過config命令讀寫指定的配置文件
通過給 config 命令 git config
添加 -f|--file
選項,并指定配置文件的路徑 git config -f 配置文件路徑
,即可在指定的配置文件中進行讀寫配置項;如
git config -f 對應的配置文件/的路徑/gitconfig_category user.name 郭斌勇