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 郭斌勇