git-config配置多用户环境以及 includeIf用法

背景

开发人员经常遇到这样的问题,公司仓库和个人仓库的用户名和邮箱配置是有区别的,为了能够很好地区分工程上传到不同的远程仓库,我们需要分别处理,保证在不同的工程使用不同的账户

介绍

  • Git支持多级配置,分别是system(系统级)global(用户级)local(项目级)worktree(工作区级)

  • 配置优先级: worktree > local > global > system

  • 在Linux环境中,分别对应

    • system

      • /etc/gitconfig: 系统级配置文件;对系统中所有用户都普遍适用的配置。使用 git config --system读写的就是这个文件。
    • global

      • ~/.gitconfig: 用户级配置文件;用户目录下的配置文件只适用于该用户。使用 git config --global读写的就是这个文件。
    • local

      • $RepoPath/.git/config: 项目级配置文件;当前项目的 git仓库目录中的配置文件(也就是工作目录中的 .git/config 文件),这里的配置仅仅针对当前项目有效。使用 git config --local或 省略 local参数,读写的就是这个文件。
    • worktree: 工作区级配置;此配置仅仅针对当前工作区有效。使用 git config --worktree进行配置。

      note :

      • 每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
      • $RepoPath为某仓库的本地路径
  • 在 Windows 系统上

    • Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME变量指定的目录,一般都是 C:\Documents and Settings\$USER。此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

配置

  1. 常规用法

    • 全局配置

      • 方法一: 在~/.gitconfig文件中添加用户名邮箱

      • 方法二: 配置全局的用户名邮箱

        git config --global user.email "you@example.com"
        git config --global user.name "Your Name"
    • 项目仓库配置

      • 方法一: 在$RepoPath/.git/config文件中添加用户名邮箱

      • 方法二: 配置项目的用户名邮箱

        # 进入 $RepoPath目录,并执行
        git config --local user.email "you@example.com"
        git config --local user.name "Your Name"
  2. includeIf用法:

    可以在git的配置文件中使用 includeincludeIf 关键字来包含其它配置文件,git在解析配置文件时,会将被包含的配置文件的内容内联到 包含指令 所在的位置;所以,被包含的配置文件的配置项会覆盖包含指令之前的配置项,包含指令之后的配置项会覆盖被包含的配置文件的配置项,即,优先级是:包含指令后面的配置项 > 被包含的配置文件的配置项 > 包含指令之前的配置项

    • 示例

      [include]
      path = /path/to/foo.inc ; # 绝对路径
      path = foo.inc ; # 相对路径,相对于当前的配置文件
      path = ~/foo.inc ; # 相对用户目录 `$HOME` 路径
    • gitdirgitdir/i

      # 当仓库所在目录包含gitdir之后的路径才会使用.inc文件
      [includeIf "gitdir:/path/to/foo/.git"]
      path = /path/to/foo.inc # 所有仓库目录在gitdir之后的路径下的,都会使用.inc文件
      [includeIf "gitdir:/path/to/group/"]
      path = /path/to/foo.inc # 路径描述也可以用定义过的环境变量代替 $HOME/to/group
      [includeIf "gitdir:~/to/group/"]
      path = /path/to/foo.inc
    • onbranch

      # 包括只有当我们是在一个工作树,其中 foo-branch 目前已核实
      [includeIf "onbranch:foo-branch"]
      path = foo.inc

    note:

    • 在2017年,git新发布的版本2.13.0包含了一个新的功能includeIf配置,可以把匹配的路径使用对应的配置用户名和邮箱;
    • "条件类型:匹配模式"includeIf 的条件;只有当条件成立时,才会包含 path 选项指定的配置文件;
    • 条件类型 和 匹配模式: 分隔;
    • 条件类型 共有以下几种 gitdirgitdir/ionbranch;
      • gitdirgitdir/i: 路径匹配模式,表示 如果 当前 git仓库的 .git 目录的位置 符合 路径匹配模式, 就加载对应的配置文件;(gitdir/i表示 匹配模式忽略大小写)
      • .git 目录的位置可能是 git 自动找到的 或是 $GIT_DIR 环境变量的值;
      • onbranch: 分支匹配模式, 表示 如果我们位于当前检出的分支名称 与 分支匹配模式 匹配的工作树中,就加载对应的配置文件;
    • 匹配模式 采用标准的 glob 通配符 再加上 表示任务路径的通配符 **;
    • path 用于指定配置文件的路径;
    • 可以通过写多个 path 来表示包含多个配置文件;

栗子

  1. 在用户配置文件 ~/.gitconfig 中添加以下内容

    • 指定工程的用户配置

      # 配置demo项目
      [includeIf "gitdir/i:~/workspace/private/demo/.git"]
      path = ~/.gitconfig_self
    • 指定目录的用户配置

      # 配置public目录
      [includeIf "gitdir/i:~/workspace/public/"]
      path = ~/.gitconfig_work # 配置private目录
      [includeIf "gitdir/i:~/workspace/private/"]
      path = ~/.gitconfig_self
    • 指定分支的用户配置

      # 配置 test-branch分支
      [includeIf "onbranch:test-branch"]
      path = ~/.gitconfig_self
  2. 配置子配置文件

    • 方法一: 直接在$path文件中添加用户名邮箱,如:

      [user]
      name = librarookie
      email = librarookie@163.com
    • 方法二: 用git config -f|--file指定$path文件的用户名邮箱

      git config -f $path user.name "Your Name"

      git config -f $path user.email "you@example.com"

      git config -f ~/.gitconfig_self user.name librarookie
      git config -f ~/.gitconfig_self user.email librarookie@163.com

Referense

git-config配置多用户环境以及 includeIf用法的更多相关文章

  1. git config配置,工作区和版本库联系。

    关于git和github的介绍,我这边不多说. 使用在windows下使用git,需要配置环境变量,也可以使用git自带的终端工具.,打开git bash laoni@DESKTOP-TPPLHIB ...

  2. git config 配置

    1. git config简介 我们知道config是配置的意思,那么git config命令就是对git进行一些配置.而配置一般都是写在配置文件里面,那么git的配置文件在哪里呢?互动一下,先问下大 ...

  3. git第一节----git config配置

    @查看git的版本 git --version @查看git配置信息 git config --list config list分全局和局部,在根目录下执行git config --list显示为全局 ...

  4. Git config配置

    git获取帮助git help config git config --help man git-config   git config --global user.name "fuleyi ...

  5. git config 配置简写命令

    在多人协作开发时,一般用git来进行代码管理. git有一些命令如:git pull . git push等等,这些命令可以设置alias,也就是缩写. 如:git pull 是 git pl, gi ...

  6. git config(转载)

    From:http://www.g2w.me/2013/10/cache-github-credential-for-https-repository/ http://openwares.net/li ...

  7. 一台电脑,两个及多个git账号配置

    1. 生成两[三]个ssh公钥私钥 方法参照:http://www.cnblogs.com/fanbi/p/7772812.html第三步骤 假定其中一个是id_rsa, 另一个时id_rsa_two ...

  8. git config --global core.excludesfile配置gitignore全局文件

    Linux中,这时把全局要忽略的文件列表.gitignore放当前用户根目录下: git config --global core.excludesfile '~/.gitignogtire' Win ...

  9. 设置 git config 的一些默认配置

    设置 git status的颜色. git config --global color.status auto 一.Git已经在你的系统中了,你会做一些事情来客户化你的Git环境.你只需要做这些设置一 ...

随机推荐

  1. hdu5197 DZY Loves Orzing(FFT+分治)

    hdu5197 DZY Loves Orzing(FFT+分治) hdu 题目描述:一个n*n的矩阵里填入1~n^2的数,要求每一排从前往后能看到a[i]个数(类似于身高阻挡视线那种),求方案数. 思 ...

  2. 羽夏看Win系统内核——调试篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  3. Rust极简教程

    目录 简介 特性 特征 用途 安装 核心组件 常用命令 基础语法 数据类型 标量类型 复合类型 示例 条件语句 循环 输出&输入 输出 输出花括号 输出非基础类型 输入 所有权 切片 结构体 ...

  4. Python 中 PyQt5 库语法(一)

    目录 PyQt5库(一) 一. 简介 1. 什么是 Qt 2. 什么是PyQt 3. 环境搭建 二. 基本结构 1. 第一个程序 2. 控件操作 3. 快速生成代码 4. 面向对象 三. 基类控件 1 ...

  5. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?

    1.64 GB 内存的机器是非常理想的, 但是 32 GB 和 16 GB 机器也是很常见的.少于 8 GB 会适得其反. 2.如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好.多 ...

  6. Protected 修饰符

    Protected 修饰的变量和方法,在子类中可见.所有的变量和方法,子类都继承( private 也是).父类的变量和方法在子类实例中预留内存空间. Private 成员不能被子类实例引用.构造方法 ...

  7. 学习MFS(六)

    一.文件系统选型 在一般的生产环境中,NFS共享存储算是比较常用的,简单.方便,但随着业务的不断扩展,数据量也是承爆发式的增长,因而对存储这些数据的文件系统要求也越来越高了,分存式.可扩展.大容量,这 ...

  8. 动态规划 洛谷P1616 疯狂的采药

    动态规划 洛谷P1616 疯狂的采药 同样也是洛谷的动态规划一个普及-的题目,接下来分享一下我做题代码 看到题目,没很认真的看数据大小,我就提交了我的代码: 1 //动态规划 洛谷P1616 疯狂的采 ...

  9. int 越界处理

    在程序运行中,如果运算结果太大超出了所定义的类型,那么可能会影响整个程序的运行结果,甚至是程序出错. 因此,在编写程序时,加入越界处理就显得一起重要了. 用整型 int 来举个例子吧,int型占四个字 ...

  10. java中Object类是怎么回事,干嘛使的?举例说明!

    Object类的作用:m a r k - t o-        w i n: 在java中,因为所有的类都有共性,所以java的缔造者们把java设计成这样:所有的类都是Object类的直接或间接子 ...