Git 分目录配置
Git目录级配置和分支级配置的解决方案
- git支持多级配置
- 系统级
- 用户级
- 项目级
- 工作区级
但是不支持目录级的配置(即:对指定目录下的所有git项目都生效的配置),所以就没有很好的办法实现给某个目录下的所有git项目设置统一的配置;为了解决这个问题,我研究了git的相关帮助文档,终于找到了我认为还算完美的解决方案,也顺便解决了分支级配置的解决方案;本文就详解这个解决方案以及其中的细节。
目录
- 问题背景
- 目录级配置场景
- 分支级配置场景
- 解决思路
- 解决方案
- 相关内容详解
- include 和 includeIf
- 4.1.1. include
- 4.1.2. includeIf
- 多级配置
- 通过config命令读写指定的配置文件
- include 和 includeIf
内容
1. 问题背景
1.1. 目录级配置场景
在用git进行提交时需要提交者的 姓名 和 邮箱,通常,我们有两个邮箱,一个是个人的邮箱,一个是工作邮箱;当一台电脑上即有 个人项目
又有 公司项目
时,需要分别为每个公司(或个人)项目设置邮箱,这很不方便;也是我们大多数人经常遇到的痛点,特别是疫情当下的居家办公场景,免不了用自己的电脑登录工作场景,因此对 git 按目录配置的需求就尤为迫切。
1.2. 分支级配置场景
有些项目需要开源,但开源的部分需要经过处理,一种方案是为开源创建一个单独的分支,比如分支名就叫 开源
,该分支的远程仓库跟内部使用的不一样,所以开源这个分支往往需要一些特殊的配置,比如提交者姓名、邮箱、Git的推送、拉策等;
如果就一个这样的项目,我们可以单独进行配置,但是如果有很多这样的项目再单独配置的话就很麻烦,也容易遗漏掉某些配置;
2. 解决思路
在用户级 或 系统级 配置文件中 通过 includeIf
配置项来有条件地加载指定配置文件;这个条件可以根据 当前git项目的目录 来设置,也可以根据当前git项目的当前Git分支来设置;这样就能实现针对不同的git仓库 或 分支 来加载不同的配置。
3. 解决方案
-
在 用户级配置文件
~/.gitconfig
(推荐 用户级配置) 或 系统级配置文件/etc/gitconfig
中的最下面,根据需求,加入以下任意一个或多个配置模板:-
根据git项目的目录来加载对应的配置文件:当 当前 git仓库的目录 符合
~/**/某类别的目录/**
时,就加载配置文件/path/to/gitconfig_category
[includeIf "gitdir:~/**/某类别的目录/**"]
path = /path/to/gitconfig_category -
根据git项目的目录来加载对应的配置文件:当 当前 git仓库的目录 在不区别大小写的情 况下 符合
~/**/某类别的目录/**
时,就加载配置文件/path/to/gitconfig_category
[includeIf "gitdir/i:~/**/某类别的目录/**"]
path = /path/to/gitconfig_category -
根据分支来加载对应的配置文件:如果我们位于当前检出的分支名称与模式匹配的工作树 中,就加载配置文件
/path/to/gitconfig_category
[includeIf "onbranch:分支名字"]
path = /path/to/gitconfig_category
-
-
在配置文件
/path/to/gitconfig_category
中编写你需要设置,或 通过 带-f|--file
选项 config 命令git config -f 配置文件路径
直接将配置项写入指定配置文件中,如:-
直接在配置文件插入相应的配置项:
[user]
email = guobinyong@qq.com -
通过 config 命令直接将配置项写入指定配置文件中:
git config -f /path/to/gitconfig_category user.email guobinyong@qq.com
-
4. 相关内容详解
4.1. include 和 includeIf
可以在git的配置文件中使用 include
和 includeIf
关键字来包含其它配置文件,git在解析配置文件时,会将被包含的配置文件的内容内联到 包含指令 所在的位置;所以,被包含的配置文件的配置项会覆盖包含指令之前的配置项,包含指令之后的配置项会覆盖被包含的配置文件的配置项,即,优先级是:包含指令后面的配置项 > 被包含的配置文件的配置项 > 包含指令之前的配置项
;
官方文档请参阅:includes配置项
4.1.1. include
包含指定的一个或多个配置文件;
示例:
[include] |
说明:
path
用于指定配置文件的路径;- 可以通过写多个
path
来表示包含多个配置文件;
4.1.2. includeIf
includeIf
指令可指定包含的条件,只有当条件成立时,才会包含指定的配置文件;
语法:
[includeIf "条件类型:匹配模式"] |
说明:
"条件类型:匹配模式"
是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仓库的目录 符合 `~某类别的目录某类别的目录某类别的目录某类别的目录 |
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 /path/to/gitconfig_category user.name syptnomi |