同台电脑使用个人和公司两个Git冲突解决

说明

本文转载:

原GitHub地址:https://github.com/xirong/my-git

====================

由于公司团队使用 GitLab 来托管代码,同时,个人在 Github 上还有一些代码仓库,可公司邮箱与个人邮箱是不同的,由此产生的 SSH key 也是不同的,这就造成了冲突 ,文章提供此类问题的解决方案:**如何在一台机器上面同时使用 Github 与 Gitlab 的服务?**

# 问题产生场景


## 无密码与远程服务器交互的秘密 - SSH

如果采用`ssh 协议`或者`git 协议`通过终端命令对远程仓库进行`push`操作的时候,大概的过程如下:(前提在 Github 上已经配置的本机的 SSH Public Key)

1. 客户端发起一个 Public Key 的认证请求,并发送RSA Key的模数作为标识符。(关于 RSA Key 详细 [维基百科](https://en.wikipedia.org/wiki/RSA_(algorithm)))

2. 服务端检查是否存在请求帐号的公钥(Linux中存储在~/.ssh/authorized_keys文件中),以及其拥有的访问权限。

3. 服务端使用对应的公钥对一个随机的256位的字符串进行加密,并发送给客户端。

4. 客户端使用私钥对字符串进行解密,并将其结合session id生成一个MD5值发送给服务端。 结合session id的目的是为了避免攻击者采用重放攻击(replay attack)。

5. 服务端采用同样的方式生成MD5值与客户端返回的MD5值进行比较,完成对客户端的认证。

6. 将push的内容进行加密与服务端传输数据。

关于 SSH,请查看 [SSH原理简介](http://erik-2-blog.logdown.com/posts/74081-ssh-principle) ,更通俗易懂的文章请查看[阮一峰-SSH原理与运用(一):远程登录](http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html) 。

## 具体场景

无论使用哪种代码托管服务商,对于 Git 而言,`邮箱` 是识别用户的唯一手段,所以对于不同的服务商,由于邮箱不同,那么通过邮件名创建的 SSH Key 自然是不同的,这时候在不同的服务商之间进行 `push` 命令的时候,Git 是不知道使用哪个 SSH Key ,自然导致 `push` 的失败。场景如下:

1. 在公司团队使用搭建的 Gitlab 服务,提交邮箱`xirong.liu@corp.xx.com`, 个人 Github 服务,提交邮箱 `ixirong.liu@gmail.com` (Bitbucket 同理)。

2. 有两个Github账户,不同的账户提交不同的仓库内容。

# 解决方案

## 方案一:同一个邮箱

由于`邮箱`是识别的唯一手段,那么自然的,这两者采用同一个邮箱,生成的 public key 也会是同一个,上传到 Github 或者 Gitlab 上面,在 Git 的配置中 ,设置好 Global 的配置 :` git config --global user.name 'xirong.liu' && git config --global user.email 'xirong.liu@corp.xx.com'` 进行日常的开发是没有问题的。

实际生活中采用同一个邮箱的可能性并不是太大,这就引出了方案二

方案二:基于config文件


所谓的方案二,原理上就是对 SSH 协议配置 config 文件,对不同的域名采用不同的认证密钥。

git config 介绍

Git有一个工具被称为git config,它允许你获得和设置配置变量;这些变量可以控制Git的外观和操作的各个方面。这些变量可以被存储在三个不同的位置:

1. /etc/gitconfig 文件:包含了适用于系统所有用户和所有库的值。如果你传递参数选项’`--system`’ 给 git config,它将明确的读和写这个文件。

2. ~/.gitconfig 文件 :具体到你的用户。你可以通过传递 ‘`--global`’ 选项使Git 读或写这个特定的文件。

3. 位于 Git 目录的 config 文件 (也就是 .git/config) :无论你当前在用的库是什么,特定指向该单一的库。每个级别重写前一个级别的值。因此,在 .git/config 中的值覆盖了在/etc/gitconfig中的同一个值,可以通过传递‘`--local`’选项使Git 读或写这个特定的文件。

由于采用了不同的邮箱,对不同的服务商进行提交,所以此时我们经常配置的 `git config --global` 就不能常用了,必须在每个仓库的目录下进行配置自己的用户名、邮箱。(嫌麻烦?xirong 是这么解决的,由于个人的 Github 上有较多的仓库,而自己团队的代码基本上都是稳定的,有数的几个,所以在 `git config --global user.email 'ixirong.liu@gmail.com'` 中全局配置的是个人邮箱,在团队的项目中配置)

1.  配置 Git 用户名、邮箱

如刚才所说,xirong 的配置如下:

# 全局配置,Github仓库中默认使用此配置

git config --global user.name 'xirong' && git config --global user.email 'ixirong.liu@gmail.com'

# 团队项目配置,每次新创建一个项目,需要执行下

git config --local user.name 'xirong.liu' && git config --local user.email 'xirong.liu@corp.xxx.com'

### 2. 生成 ssh key 上传到 Github/Gitlab

ssh key 默认生成后保存在 `~/.ssh/`目录下 ,默认为 `id_rsa 和 id_rsa.pub` 两个文件,由于我们需要分开配置,所以这么做:

# 生成公钥、密钥的同时指定文件名,Gitlab使用

ssh-keygen -t rsa -f ~/.ssh/id_rsa.gitlab -C "xirong.liu@corp.xxx.com"

# 生成默认,Github使用

ssh-keygen -t rsa -C "ixirong.liu@gmail.com"


命令执行完成后,这时`~/.ssh`目录下会多出`id_rsa.gitlab`和`id_rsa.gitlab.pub`两个文件,`id_rsa.gitlab.pub` 里保存的就是我们要使用的key,这个key就是用来上传到 Gitlab上的。

### 3. 配置 config 文件

在 `~/.ssh`目录下,如果不存在,则新建 `touch ~/.ssh/config`文件 ,文件内容添加如下:

Host *.corp.xxx.com

IdentityFile ~/.ssh/id_rsa.gitlab

User xirong.liu

配置完成后,符合 `*.corp.xxx.com`后缀的 Git 仓库,均采取` ~/.ssh/id_rsa.gitlab` 密钥进行验证,其它的采取默认的。

4. 上传public key 到 Github/Gitlab

以Github为例,过程如下:

1. 登录github

2. 点击右上方的Accounting settings图标

3. 选择 SSH key

4. 点击 Add SSH key

在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的`~/.ssh/id_rsa.pub`文件内容粘帖到`key`一栏,在点击“`add key`”按钮就可以了。

添加过程github会提示你输入一次你的github密码 ,确认后即添加完毕。 上传Gitlab的过程一样,请自己操作。

 5. 验证是否OK

由于每个托管商的仓库都有唯一的后缀,比如 Github的是 `git@github.com:*`,所以可以这样测试:


➜  ~  ssh -T git@github.com

Hi xirong! You've successfully authenticated, but GitHub does not provide shell access.

➜  ~  ssh -T git@gitlab.dev

Welcome to GitLab, xirong.liu!

看到这些 `Welcome` 信息,说明就是 OK的了。

以后,如果还有任何的需求,都可以这么解决,看下 xirong 的几个托管仓库:

➜  ~  ll ~/.ssh

total 40

-rw-r--r-- 1 xirong staff  264 Jul 10 14:42 config

-rw------- 1 xirong staff 3243 Jul 10 14:09 id_rsa

-rw------- 1 xirong staff 1675 Jan 28 20:39 id_rsa.gitlab

-rw-r--r-- 1 xirong staff  407 Jan 28 20:39 id_rsa.gitlab.pub

-rw-r--r-- 1 xirong staff  747 Jul 10 14:09 id_rsa.pub

-rw------- 1 xirong staff 1679 Jun 22 11:42 id_rsa_gitcafe

-rw-r--r-- 1 xirong staff  407 Jun 22 11:42 id_rsa_gitcafe.pub

-rw-r--r-- 1 xirong staff 9139 Jul 29 15:08 known_hosts

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345