Git目录级配置和分支级配置的解决方案:对目录内所有Git项目都生效的配置方案


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命令读写指定的配置文件

内容

1. 问题背景

在用git进行提交时需要提交的 姓名 和 邮箱,然而,我们通常有两个邮箱,一个是个人的个人邮箱,一个是上班时的工作邮箱;当一台电脑上即有个人项目 又有 公司项目时,我们需要分别为每个公司(或个人)项目设置邮箱,这很不方便;

2. 解决思路

在用户级 或 系统级 配置文件中 通过 includeIf 配置项来有条件地加载指定配置文件;这个条件可以根据git项目的目录来设置,也可以根据分支来设置;这样就能实现针对不同的git仓库 或 分支 来加载不同的配置。

3. 解决方案

  1. 在 用户级配置文件 ~/.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
  2. 在配置文件 对应的配置文件/的路径/gitconfig_category 中编写你需要设置,或 通过 带 -f|--file选项 config 命令 git config -f 配置文件路径 直接将配置项写入指定配置文件中,如:
    • 直接在配置文件插入相应的配置项:
      1
      2
      [user]
          email = [email protected]

    • 通过 config 命令直接将配置项写入指定配置文件中:
      1
      git config -f 对应的配置文件/的路径/gitconfig_category   user.email  [email protected]

4. 相关内容详解

4.1. include 和 includeIf

可以在git的配置文件中使用 includeincludeIf 关键字来包含其它配置文件,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

includeIf 指令可指定包含的条件,只有当条件成立时,才会包含指定的配置文件;

语法:

1
2
3
[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:分支匹配模式 :表示 如果我们位于当前检出的分支名称 与 分支匹配模式 匹配的工作树中,就加载对应的配置文件;

示例:

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支持多级配置,如:系统级、用户级、项目级、工作区级;它们的优先级如下:工作区级配置 > 项目级配置 > 用户级配置 > 系统级配置;每级配置记录在对应的配置文件中,通过 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 配置文件路径 ,即可在指定的配置文件中进行读写配置项;如

1
git config -f 对应的配置文件/的路径/gitconfig_category   user.name  郭斌勇