git支持多级配置,如:系统级、用户级、项目级、工作区级;但是不支持目录级的配置(即:对指定目录下的所有git项目都生效的配置),所以就没有很好的办法实现给某个目录下的所有git项目设置统一的配置;为了解决这个问题,我研究了git的相关帮助文档,终于找到了我认为还算完美的解决方案;本文就详解这个解决方案以及其中的细节。
目录
- 1. 问题背景
- 2. 解决思路
- 3. 解决方案
-
4. 相关内容详解
-
4.1. include 和 includeIf
- 4.1.1. include
- 4.1.2. includeIf
- 4.2. 多级配置
- 4.3. 通过config命令读写指定的配置文件
-
4.1. include 和 includeIf
内容
1. 问题背景
在用git进行提交时需要提交的 姓名 和 邮箱,然而,我们通常有两个邮箱,一个是个人的个人邮箱,一个是上班时的工作邮箱;当一台电脑上即有个人项目 又有 公司项目时,我们需要分别为每个公司(或个人)项目设置邮箱,这很不方便;
2. 解决思路
在用户级 或 系统级 配置文件中 通过
3. 解决方案
- 在 用户级配置文件
~/.gitconfig (推荐 用户级配置) 或 系统级配置文件/etc/gitconfig 中的最下面,根据需求,加入以下任意一个或多个配置模板:- 根据git项目的目录来加载对应的配置文件:当 当前 git仓库的目录 符合
~/**/某类别的目录/** 时,就加载配置文件对应的配置文件/的路径/gitconfig_category 1
2[includeIf "gitdir:~/**/某类别的目录/**"]
path = 对应的配置文件/的路径/gitconfig_category - 根据git项目的目录来加载对应的配置文件:当 当前 git仓库的目录 在不区别大小写的情 况下 符合
~/**/某类别的目录/** 时,就加载配置文件对应的配置文件/的路径/gitconfig_category 1
2[includeIf "gitdir/i:~/**/某类别的目录/**"]
path = 对应的配置文件/的路径/gitconfig_category - 根据分支来加载对应的配置文件:如果我们位于当前检出的分支名称与模式匹配的工作树 中,就加载配置文件
对应的配置文件/的路径/gitconfig_category 1
2[includeIf "onbranch:分支名字"]
path = 对应的配置文件/的路径/gitconfig_category
- 根据git项目的目录来加载对应的配置文件:当 当前 git仓库的目录 符合
- 在配置文件
对应的配置文件/的路径/gitconfig_category 中编写你需要设置,或 通过 带-f|--file 选项 config 命令git config -f 配置文件路径 直接将配置项写入指定配置文件中,如:- 直接在配置文件插入相应的配置项:
1
2[user]
email = [email protected] - 通过 config 命令直接将配置项写入指定配置文件中:
1git config -f 对应的配置文件/的路径/gitconfig_category user.email [email protected]
- 直接在配置文件插入相应的配置项:
4. 相关内容详解
4.1. include 和 includeIf
可以在git的配置文件中使用
官方文档请参阅:includes配置项
4.1.1. include
包含指定的一个或多个配置文件;
示例:
1 2 3 4 | [include] path = /path/to/foo.inc ; 绝对路径 path = foo.inc ; 相对路径,相对于当前的配置文件 path = ~/foo.inc ; 相对用户目录 `$HOME` 路径 |
说明:
-
path 用于指定配置文件的路径; - 可以通过写多个
path 来表示包含多个配置文件;
4.1.2. includeIf
语法:
1 2 3 | [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:分支匹配模式 :表示 如果我们位于当前检出的分支名称 与分支匹配模式 匹配的工作树中,就加载对应的配置文件;
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 当 当前 git仓库的目录 符合 `~/**/某类别的目录/**` 时,就加载对应的配置文件 [includeIf "gitdir:~/**/某类别的目录/**"] path = 某类别/对应的配置文件1/的路径 path = 某类别/对应的配置文件2/的路径 # 当 当前 git仓库的目录 在不区别大小写的情况下 符合 `~/**/某类别的目录/**` 时,就加载对应的配置文件 [includeIf "gitdir/i:~/**/某类别的目录/**"] path = 某类别/对应的配置文件1/的路径 path = 某类别/对应的配置文件2/的路径 # 如果我们位于当前检出的分支名称与模式匹配的工作树中,就加载对应的配置文件 [includeIf "onbranch:分支名字"] path = 对应的配置文件1/的路径 path = 对应的配置文件2/的路径 |
4.2. 多级配置
git支持多级配置,如:系统级、用户级、项目级、工作区级;它们的优先级如下:
-
/etc/gitconfig :系统级配置文件;对系统中所有用户都普遍适用的配置。若使用git config 时用--system 选项,读写的就是这个文件。 -
~/.gitconfig :用户级配置文件;用户目录下的配置文件只适用于该用户。若使用git config 时用--global 选项,读写的就是这个文件。 - 当前项目的 git仓库目录中的配置文件(也就是工作目录中的
.git/config 文件):这里的配置仅仅针对当前项目有效。若使用git config 时用--local 选项 或 省略,读写的就是这个文件。 - 工作区级配置文件 :这里的配置仅仅针对当前工作区有效。若使用
git config 时用--worktree 选项,读写的就是这个文件。
4.3. 通过config命令读写指定的配置文件
通过给 config 命令
1 | git config -f 对应的配置文件/的路径/gitconfig_category user.name 郭斌勇 |