用于个人和工作的
Git
账户进行提交,而无需手动重置你的配置。
Git
是一个分布式版本控制软件,最初由 林纳斯·托瓦兹 创作,于 2005
年以 GPL
协议发布。最初目的是为更好地管理 Linux
内核开发而设计。很多著名的软件都使用 Git
进行版本控制,其中包括 Linux
内核、X.Org
服务器和 OLPC
内核等项目的开发流程。
1. 背景介绍
存在痛点的时候,我们才会体会到其存在的好处了!
Git
的 git config 命令可以让你为 Git
设置用户名、邮箱等全局选项和配置。其有很多选项和配置,其中一个就是 includeIf
选项,它能够帮助我们在拥有多个 Git
用户的时候可以灵活的切换到对应的用户上,且使用起来非常方便。
比如说,我们在工作时间需要处理公司的工作,不管是 GitHub
也好,还是 GitLab
也罢。同时,我们又在业余的时间为开源项目提交代码做贡献。在这种情况下,我们肯定不想在这两种不同的情况下使用一个共同的配置。我们肯定是希望,在不同的情况下使用不同的配置,尤其是当我们只有一台计算的话。
我的情况就是上述表述的那样,所以我需要在 Git
配置中保留两种不同的邮件 ID
。这样一来,上班时间使用公司邮箱进行代码的提交,而在下班之后可以使用 GitHub
的邮箱进行自己茶余饭后的娱乐。而应该如何配置呢?这就是一个非常总要的问题了!
2. 选项使用
其实就是使用
includeIf
选项来完成的,见证奇迹吧!
在 2017
年,Git
新发布的版本 2.13.0
包含了一个新的功能 includeIf
配置,可以把匹配的路径使用对应的配置用户名和邮箱。
其中 includeIf.condition.path
变量,是 include
配置指令的一部分,其允许我们通过条件过滤的方式设置属于我们自己的自定义配置。includeIf
指令支持三个子关键字,分别是:gitdir
、gitdir/I
和 onbranch
。
- [1]
gitdir
关键字 gitdir
:后面的内容用于全局匹配(golb
模式),如果 Git
目录与模式匹配,则满足 include
条件。Git
仓库的配置,可以由程序自己发现或者通过 GIT_DIR
环境变量来配置。该模式下,可以使用标准的通配符之外,还附加了两个额外的通配符,分别是 **/
和 /**
两种,它们用于匹配多个路径。
如果该模式以 ~/
开头的话,~
将被环境变量 HOME
的内容所替代。如果模式以 ./
开头的话,它将被包含当前配置文件的目录替换。
如果该模式不以 ~/
开头的话,则 ./
、/
和 **/
将自动预置。例如,我们将匹配模式从 foo/bar
变为 **/foo/bar
的话,将匹配 /any/path/to/foo/bar
。如果模式以 /
结束的话,**
将被自动被添加到其尾部。例如,我们设置模式默认为 foo/
的话,将变成 foo/**
这样。换句话说,它递归地匹配 foo
和里面的所有内容。
- [2]
gitdir/I
关键字 gitdir/I
:这与 gitdir
相同,只是匹配是大小写不敏感的,例如在不区分大小写的文件系统上。
- [3]
onbranch
关键字 onbranch
:后面的数据被认为是一个模式!该模式下,可以使用标准的通配符之外,还附加了两个额外的通配符,分别是 **/
和 /**
两种,它们用于匹配多个路径。如果在工作树中,当前签出的分支的名称与模式匹配,则满足 include
条件。
如果模式以 /
结束的话,**
将被自动添加。例如,我们设置模式默认为 foo/
的话,将变成 foo/**
这样,它匹配所有以 foo/
开头的分支。如果您的分支是按层次结构组织的,并且您希望将配置应用于该层次结构中的所有分支,那么这是非常有用的。
[core]
filemode = false
[diff]
external = /usr/local/bin/diff-wrapper
renames = true
[branch "devel"]
remote = origin
merge = refs/heads/devel
; include if $GIT_DIR is /path/to/foo/.git
[includeIf "gitdir:/path/to/foo/.git"]
path = /path/to/foo.inc
; include for all repositories inside /path/to/group
[includeIf "gitdir:/path/to/group/"]
path = /path/to/foo.inc
; include for all repositories inside $HOME/to/group
[includeIf "gitdir:~/to/group/"]
path = /path/to/foo.inc
; relative paths are always relative to the including
; file (if the condition is true); their location is not
; affected by the condition
[includeIf "gitdir:/path/to/group/"]
path = foo.inc
; include only if we are in a worktree where foo-branch is
; currently checked out
[includeIf "onbranch:foo-branch"]
path = foo.inc
3. 内容配置
在我们给定的配置文件中,配置我们自己需要区别的配置!
- [1] 全局配置文件
~/.gitconfig
里面原有的user
部分需要删除掉~/.gitconfig
里面的includeIf
后面的path
需要以/
结尾- 个人项目目录和公司项目目录需要是非包含关系,即非父子目录等
# 配置文件地址
# 全局通用配置文件
$HOME/.gitconfig
# 一切献给了开源
[includeIf "gitdir:~/github_dir/"]
# 个人项目配置文件
path = ~/.git/.gitconfig-github
# 一切献给了工作
[includeIf "gitdir:~/working_dir/"]
# 公司项目配置文件
path = ~/.git/.gitconfig-working
- [2] 个人项目配置文件
$ cat ~/.git/.gitconfig-github
[user]
name = yourname-self
email = [email protected]
- [3] 公司项目配置文件
$ cat ~/.git/.gitconfig-working
[user]
name = yourname-self
email = [email protected]