Git目錄級配置和分支級配置的解決方案:對目錄內所有Git項目都生效的配置方案

git支持多級配置,如:系統級、用戶級、項目級、工作區級;但是不支持目錄級的配置(即:對指定目錄下的所有git項目都生效的配置),所以就沒有很好的辦法實現給某個目錄下的所有git項目設置統一的配置;為了解決這個問題,我研究了git的相關幫助文檔,終于找到了我認為還算完美的解決方案,也順便解決了分支級配置的解決方案;本文就詳解這個解決方案以及其中的細節。

目錄

內容

1. 問題背景

1.1. 目錄級配置場景

在用git進行提交時需要提交者的 姓名 和 郵箱,然而,我們通常有兩個郵箱,一個是個人的個人郵箱,一個是上班時的工作郵箱;當一臺電腦上即有個人項目 又有 公司項目時,我們需要分別為每個公司(或個人)項目設置郵箱,這很不方便;

1.2. 分支級配置場景

有些項目需要開源,但開源的部分需要經過處理,一種方案是為開源創建一個單獨的分支,比如分支名就叫 開源,該分支的遠程倉庫跟內部使用的不一樣,所以開源這個分支往往需要一些特殊的配置,比如提交者姓名、郵箱、Git的推送、拉策等;

如果就一個這樣的項目,我們可以單獨進行配置,但是如果有很多這樣的項目再單獨配置的話就很麻煩,也容易遺漏掉某些配置;

2. 解決思路

在用戶級 或 系統級 配置文件中 通過 includeIf 配置項來有條件地加載指定配置文件;這個條件可以根據 當前git項目的目錄 來設置,也可以根據當前git項目的當前Git分支來設置;這樣就能實現針對不同的git倉庫 或 分支 來加載不同的配置。

3. 解決方案

  1. 在 用戶級配置文件 ~/.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
      
  2. 在配置文件 對應的配置文件/的路徑/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的配置文件中使用 includeincludeIf 關鍵字來包含其它配置文件,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  郭斌勇
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370