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 选项指定的配置文件;
  • 条件类型匹配模式: 分隔;
  • 条件类型 共有以下几种 gitdirgitdir/ionbranch
  • 匹配模式 采用标准的 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阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342