8000 怎样在一台电脑上同时使用公司 GitLab 和 Github 的服务? · Dream-git/my-git@14f9b37 · GitHub
[go: up one dir, main page]

Skip to content

Commit 14f9b37

Browse files
committed
怎样在一台电脑上同时使用公司 GitLab 和 Github 的服务?
1 parent 17a67ce commit 14f9b37

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed

readme.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ mac和linux系统推荐使用终端即可,git一开始的命令的确很多,
5050
- git 的大文件支持[Git LFS](https://github.com/github/git-lfs) : git在对大文件进行版本管理的时候,速度上是很慢的,一个帮助处理大文件的扩展插件。
5151

5252

53-
# 最佳实践备注
53+
# 实践备忘
5454
- 常用命令手册 [git-cheat-sheet && Git常用命令列表](command-handbook/)
5555
- 总是使用 `git merge --no-ff` 而不是 `git merge` ,记录下分支的变更历史。 详情 http://stackoverflow.com/questions/9069061/what-is-the-difference-between-git-merge-and-git-merge-no-ff
5656
- 恰当的使用 `git pull --rebase` 避免不必要的merge记录。 详情 http://stackoverflow.com/questions/2472254/when-should-i-use-git-pull-rebase
5757
- [git-flight-rules](https://github.com/k88hudson/git-flight-rules) 一些日常使用中的场景,比如提交错了分支、提交时的用户名邮箱不对、丢弃某些提交、未提交的代码直接提交到另外一个分支等等,很实用。
5858
- [How to undo (almost) anything with Git](https://github.com/blog/2019-how-to-undo-almost-anything-with-git) 撤销一切,汇总各种回滚撤销的场景,加强学习。
59+
- [怎样在一台电脑上同时使用公司 GitLab 和 Github 的服务?](use-gitlab-github-together.md) 由于公司团队使用 GitLab 来托管代码,同时,个人在 Github 上还有一些代码仓库,可公司邮箱与个人邮箱是不同的,由此产生的 SSH key 也是不同的,这就造成了冲突 ,文章提供此类问题的解决方案。
5960

use-gitlab-github-together.md

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
2+
说明
3+
====================
4+
5+
由于公司团队使用 GitLab 来托管代码,同时,个人在 Github 上还有一些代码仓库,可公司邮箱与个人邮箱是不同的,由此产生的 SSH key 也是不同的,这就造成了冲突 ,文章提供此类问题的解决方案:**如何在一台机器上面同时使用 Github 与 Gitlab 的服务?**
6+
7+
# 问题产生场景
8+
-------------
9+
10+
## 无密码与远程服务器交互的秘密 - SSH
11+
如果采用`ssh 协议`或者`git 协议`通过终端命令对远程仓库进行`push`操作的时候,大概的过程如下:(前提在 Github 上已经配置的本机的 SSH Public Key)
12+
13+
1. 客户端发起一个 Public Key 的认证请求,并发送RSA Key的模数作为标识符。(关于 RSA Key 详细 [维基百科](https://en.wikipedia.org/wiki/RSA_(algorithm))
14+
2. 服务端检查是否存在请求帐号的公钥(Linux中存储在~/.ssh/authorized_keys文件中),以及其拥有的访问权限。
15+
3. 服务端使用对应的公钥对一个随机的256位的字符串进行加密,并发送给客户端。
16+
4. 客户端使用私钥对字符串进行解密,并将其结合session id生成一个MD5值发送给服务端。 结合session id的目的是为了避免攻击者采用重放攻击(replay attack)。
17+
5. 服务端采用同样的方式生成MD5值与客户端返回的MD5值进行比较,完成对客户端的认证。
18+
6. 将push的内容进行加密与服务端传输数据。
19+
20+
关于 SSH,请查看 [SSH原理简介](http://erik-2-blog.logdown.com/posts/74081-ssh-principle) ,更通俗易懂的文章请查看[阮一峰-SSH原理与运用(一):远程登录](http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html)
21+
22+
## 具体场景
23+
无论使用哪种代码托管服务商,对于 Git 而言,`邮箱` 是识别用户的唯一手段,所以对于不同的服务商,由于邮箱不同,那么通过邮件名创建的 SSH Key 自然是不同的,这时候在不同的服务商之间进行 `push` 命令的时候,Git 是不知道使用哪个 SSH Key ,自然导致 `push` 的失败。场景如下:
24+
25+
1. 在公司团队使用搭建的 Gitlab 服务,提交邮箱`xirong.liu@corp.xx.com`, 个人 Github 服务,提交邮箱 `ixirong.liu@gmail.com` (Bitbucket 同理)。
26+
2. 有两个Github账户,不同的账户提交不同的仓库内容。
27+
28+
# 解决方案
29+
30+
## 方案一:同一个邮箱
31+
由于`邮箱`是识别的唯一手段,那么自然的,这两者采用同一个邮箱,生成的 public key 也会是同一个,上传到 Github 或者 Gitlab 上面,在 Git 的配置中 ,设置好 Global 的配置 :` git config --global user.name 'xirong.liu' && git config --global user.email 'xirong.liu@corp.xx.com'` 进行日常的开发是没有问题的。
32+
33+
实际生活中采用同一个邮箱的可能性并不是太大,这就引出了方案二
34+
35+
## 方案二:基于config文件
36+
37+
所谓的方案二,原理上就是对 SSH 协议配置 config 文件,对不同的域名采用不同的认证密钥。
38+
39+
#### git config 介绍
40+
Git有一个工具被称为git config,它允许你获得和设置配置变量;这些变量可以控制Git的外观和操作的各个方面。这些变量可以被存储在三个不同的位置:
41+
42+
1. /etc/gitconfig 文件:包含了适用于系统所有用户和所有库的值。如果你传递参数选项’`--system`’ 给 git config,它将明确的读和写这个文件。
43+
2. ~/.gitconfig 文件 :具体到你的用户。你可以通过传递 ‘`--global`’ 选项使Git 读或写这个特定的文件。
44+
3. 位于 Git 目录的 config 文件 (也就是 .git/config) :无论你当前在用的库是什么,特定指向该单一的库。每个级别重写前一个级别的值。因此,在 .git/config 中的值覆盖了在/etc/gitconfig中的同一个值,可以通过传递‘`--local`’选项使Git 读或写这个特定的文件。
45+
46+
由于采用了不同的邮箱,对不同的服务商进行提交,所以此时我们经常配置的 `git config --global` 就不能常用了,必须在每个仓库的目录下进行配置自己的用户名、邮箱。(嫌麻烦?xirong 是这么解决的,由于个人的 Github 上有较多的仓库,而自己团队的代码基本上都是稳定的,有数的几个,所以在 `git config --global user.email 'ixirong.liu@gmail.com'` 中全局配置的是个人邮箱,在团队的项目中配置)
47+
48+
### 1. 配置 Git 用户名、邮箱
49+
50+
如刚才所说,xirong 的配置如下:
51+
52+
``` bash
53+
# 全局配置,Github仓库中默认使用此配置
54+
git config --global user.name 'xirong' && git config --global user.email 'ixirong.liu@gmail.com'
55+
56+
# 团队项目配置,每次新创建一个项目,需要执行下
57+
git config --local user.name 'xirong.liu' && git config --local user.email 'xirong.liu@corp.xxx.com'
58+
```
59+
60+
### 2. 生成 ssh key 上传到 Github/Gitlab
61+
62+
ssh key 默认生成后保存在 `~/.ssh/`目录下 ,默认为 `id_rsa 和 id_rsa.pub` 两个文件,由于我们需要分开配置,所以这么做:
63+
64+
``` bash
65+
# 生成公钥、密钥的同时指定文件名,Gitlab使用
66+
ssh-keygen -t rsa -f ~/.ssh/id_rsa.gitlab -C "xirong.liu@corp.xxx.com"
67+
68+
# 生成默认,Github使用
69+
ssh-keygen -t rsa -C "ixirong.liu@gmail.com"
70+
```
71+
72+
命令执行完成后,这时`~/.ssh`目录下会多出`id_rsa.gitlab``id_rsa.gitlab.pub`两个文件,`id_rsa.gitlab.pub` 里保存的就是我们要使用的key,这个key就是用来上传到 Gitlab上的。
73+
74+
### 3. 配置 config 文件
75+
`~/.ssh`目录下,如果不存在,则新建 `touch ~/.ssh/config`文件 ,文件内容添加如下:
76+
77+
``` bash
78+
Host *.corp.xxx.com
79+
IdentityFile ~/.ssh/id_rsa.gitlab
80+
User xirong.liu
81+
```
82+
83+
配置完成后,符合 `*.corp.xxx.com`后缀的 Git 仓库,均采取` ~/.ssh/id_rsa.gitlab` 密钥进行验证,其它的采取默认的。
84+
85+
### 4. 上传public key 到 Github/Gitlab
86+
87+
以Github为例,过程如下:
88+
89+
1. 登录github
90+
2. 点击右上方的Accounting settings图标
91+
3. 选择 SSH key
92+
4. 点击 Add SSH key
93+
94+
在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的`~/.ssh/id_rsa.pub`文件内容粘帖到`key`一栏,在点击“`add key`”按钮就可以了。
95+
96+
添加过程github会提示你输入一次你的github密码 ,确认后即添加完毕。 上传Gitlab的过程一样,请自己操作。
97+
98+
### 5. 验证是否OK
99+
由于每个托管商的仓库都有唯一的后缀,比如 Github的是 `git@github.com:*`,所以可以这样测试:
100+
101+
``` bash
102+
~ ssh -T git@github.com
103+
Hi xirong! You've successfully authenticated, but GitHub does not provide shell access.
104+
➜ ~ ssh -T git@gitlab.dev
105+
Welcome to GitLab, xirong.liu!
106+
```
107+
108+
看到这些 `Welcome` 信息,说明就是 OK的了。
109+
110+
以后,如果还有任何的需求,都可以这么解决,看下 xirong 的几个托管仓库:
111+
112+
``` bash
113+
➜ ~ ll ~/.ssh
114+
total 40
115+
-rw-r--r-- 1 xirong staff 264 Jul 10 14:42 config
116+
-rw------- 1 xirong staff 3243 Jul 10 14:09 id_rsa
117+
-rw------- 1 xirong staff 1675 Jan 28 20:39 id_rsa.gitlab
118+
-rw-r--r-- 1 xirong staff 407 Jan 28 20:39 id_rsa.gitlab.pub
119+
-rw-r--r-- 1 xirong staff 747 Jul 10 14:09 id_rsa.pub
120+
-rw------- 1 xirong staff 1679 Jun 22 11:42 id_rsa_gitcafe
121+
-rw-r--r-- 1 xirong staff 407 Jun 22 11:42 id_rsa_gitcafe.pub
122+
-rw-r--r-- 1 xirong staff 9139 Jul 29 15:08 known_hosts
123+
```

0 commit comments

Comments
 (0)
0