背景
当同时为不同的组织工作时,需要用到不同的身份。比如 GitHub 目录 ~/github/ 提交身份为 mygithub,在Gitee 目录 ~/gitee/ 提交身份为mygitee。使用过git的人都知道,如果不做额外的配置,只能使用一个身份进行代码提交。而这并不是我们想要的。
我们希望达到的效果是,在同一台开发机下,使用git在不同的组织项目下提交代码表现的身份会不一样。
例如:~/github/ 目录下放的都是GitHub 组织的项目,我提交代码时commit时的作者是 mygithub,~/gitee/ 目录下是 gitee 组织的项目,我提交代码时的作者是mygitee
系统配置及不生效原因分析
Git 使用一系列配置文件来保存你自定义的行为。
- 系统: 它首先会查找系统级的 /etc/gitconfig 文件,该文件含有系统里每位用户及他们所拥有的仓库的配置值。 如果你传递 --system 选项给 git config,它就会读写该文件。
- 全局:接下来 Git 会查找每个用户的 ~/.gitconfig 文件(或者 ~/.config/git/config 文件)。 你可以传递 --global 选项让 Git 读写该文件。
- 本地:最后 Git 会查找你正在操作的仓库所对应的 Git 目录下的配置文件(.git/config)。 这个文件中的值只对该仓库有效,它对应于向 git config 传递 --local 选项。
以上三个层次中每层的配置(系统、全局、本地)都会覆盖掉上一层次的配置,所以 .git/config 中的值会覆盖掉 /etc/gitconfig 中所对应的值。优先级为 本地>全局>系统
因此大概率是因为,有更高优先级的配置覆盖了你的配置,可以根据优先级去排查
git config --list
配置多用户方式
使用本地配置
这种方式最直接,在当前的代码仓库的根目录下找到 .git/config 文件,在文件中添加如下
[user]
name = mygithub
email = yourgithubemail@xx.com
这种方式虽然成效快,只适用于临时情况。要想想每个代码仓库都需要这样改,一旦仓库多就不好维护了。
修改全局配置
全局通用配置文件~/.gitconfig里面的内容是:主要是通过 includeIf 配置匹配不用的目录映射到不同配置文件上,然后在不同的配置文件上来进行区分配置。 在 ~/.gitconfig 文件有如下配置
[user]
name = mygithub
email = yourgithubemail@xx.com
[includeIf "gitdir:~/gitee/"]
path = .gitconfig-gitee
在 ~/.gitconfig-gitee 配置如下
[user]
name = mygitee
email = yourgiteeemail@xx.com
有几点说明
- 在 .gitconfig 文件中必须有一个默认的user配置,否则在commit 代码时可能出现需要重新配置用户名和密码
- .gitconfig 中 user 和 incluedIf 的前后位置有可能导致配置不生效。其原因是,两个地方都配置的user,导致前后user的配置覆盖。 排查方式为,在当前仓库下执行 git config --list 就可以看到对当前仓库生效的配置。后面的配置会覆盖前面的配置。
利用 .ssh/config 文件
- 生成github与gitee的公钥与私钥
ssh-keygen -t rsa -C “gitee对应的邮箱” -f ~/.ssh/id_rsa_gitee
ssh-keygen -t rsa -C “github账户的邮箱”
成功后目录下应该有这样四个文件 id_rsa,id_rsa.pub,id_rsa_gitee,id_rsa_gitee.pub
-rw------- 1 root staff 2610 5 30 15:26 id_rsa
-rw-r--r-- 1 root staff 576 5 30 15:26 id_rsa.pub
-rw------- 1 root staff 2610 9 21 10:46 id_rsa_gitee
-rw-r--r-- 1 root staff 576 9 21 10:46 id_rsa_gitee.pub
- 把对应的秘钥添加到ssh-agent的高速缓存中
ssh-agent bash
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_gitee
- .ssh目录下新建config文件,如果有了就直接编辑添加一下内容
Host gitee
Hostname gitee.com
User mygitee
IdentityFile ~/.ssh/id_rsa_gitee
Host github
Hostname github.com
User mygithub
IdentityFile ~/.ssh/id_rsa
- 将对应的公钥 id_rsa.pubid_rsa_gitee.pub配置到对应平台。
- 测试链接是否通
ssh -T git@github.com
ssh -T git@gitee.com
总结
经过各大搜索引擎的搜索,使用 .ssh/config 配置的文章最多,笔者也尝试使用此方式,但是并没有生效。最后使用了第二种全局配置,验证成功,但是需要注意容易踩坑的两点。第一种情况尝试过,也能成功。
|