入门学习Git的过程中,产生了这样的困惑:
在电脑上,如果要用Git,我们需要通过命令git config --global user.name "myname"
和git config --global user.email "myname@email.com"
来配置用户名和email,表明是“谁”在操作Git,来做提交代码等等一系列操作。
另外,如果我们需要使用代码托管的服务,比如GitHub,GitHub也会要求我们提供email和用户名来注册来注册,也需要用户名和email。
再有,如果我们选择用ssh来访问GitHub的话(比用https方便,https每次都需要输入用户名密码),需要产生密钥对,很多人推荐的产生秘钥对的方法是用命令ssh-keygen -t rsa -C "myname@email.com"
,又要提供一个email。
这三个地方的email到底什么关系,该怎么设置呢?下面是我的理解,可能有偏颇,看官取精华,去糟粕,不要恶语相向。
基本前提建设
1. 个人电脑情况
电脑简称 | 说明 |
---|---|
HoPC | 家中使用的台式电脑,Mac系统 |
CoPC | 公司使用的台式电脑,Windows系统 |
Book | 自己的笔记本电脑,Windows系统 |
VM | 开发用虚拟机,Linux系统 |
2. 代码托管网站账户情况
代码托管网站 | 用户名 | email地址 | 说明 |
---|---|---|---|
GitHub | personal | personal@126.com | 个人邮箱 |
Gitee | company | company@company.cn | 公司邮箱 |
假定的情况是这样,需要在4台电脑(3台真实物理机,1台虚拟机)上做开发,我们假设一部分个人的兴趣性工作,代码托管到GitHub,另一部分是公司的工作,代码托管到Gitee上,现实中可能是公司搭建的私有服务器,这里用Gitee来假设。
该如何设定
1. SSH秘钥该如何产生和设定
设定SSH秘钥,一定要理解,SSH密钥对本质上是为了方便,用来替代用户名口令的认证方式的。从代码托管网站的角度来说,我们注册的时候,提供了我们邮箱,用户名,并设定了密码,因此代码托管网站只能通过用户名口令来认证是否真的是我们这个账户的拥有者在操作。所以,如果用https的方式,就不用产生什么密钥对了,但是,每次都输入密码,不方便。
SSH方式,本地产生密钥对,然后把公钥加入到代码托管网站的秘钥允许列表里面,把公钥加入到网站的允许列表这一步是需要密码授权的。这样操作,网站承认这样一个事实:用这个密钥对访问我,等同于提供了密码。密钥对保存在某台机器上,这样从这台机器上访问网站就不需要密码了,因为这台机器上能找到秘钥来替代口令进行认证。
所以,很多博客上,产生秘钥对的时候命令是:ssh-keygen -t rsa -C "myname@email.com"
,里面的-C参数带的email地址没有什么实际用处。从命令本身来说,-C只是给产生的秘钥对加了一个注释。用notepad++打开id_rsa.pub,可以看到末尾处,有这个email地址,方便以后拿到这个密钥对的时候,根据这个可能能回忆起来当初产生这个密钥对是干嘛的。
结论1:产生ssh密钥对时,ssh-keygen -t rsa -C "myname@email.com"
,里面输入的email与Git设定的用户名,与GitHub等代码托管网站的用户名毫无关联。
推荐做法是:每台电脑上产生秘钥对时,加注释信息内容主要跟这台机器相关的内容,并且把秘钥加入到代码托管网站的列表里面的时候,用这个跟某台电脑密切相关的名称。以后如果,不用这台电脑了,从网站上删除这个秘钥很方便。
电脑简称 | 秘钥对产生注释 | 代码托管网站上秘钥标题 |
---|---|---|
HoPC | -C "HoPC" | HoPC |
CoPC | -C "CoPC" | CoPC |
Book | -C "Book" | Book |
VM | -C "VM" | VM |
产生了4个密钥对,把这个4个秘钥对的公钥,分别加入到GitHub和Gitee的SSH公钥列表里面。对于某台电脑来说,只需要一个密钥对,就能够访问多个代码托管网站了,我们这里,访问GitHub的时候,秘钥替代了personal@126.com这个账户的的密码,而访问Gitee的时候,就代表的是company@company.cn这个账户了。
2. git本地用户名和email如何设定
这里需要注意的是代码托管网站对本地设定的账户是如何处理的。代码托管网站,主要看email,用email地址来匹配自己的账户名的邮件地址,如果相同,代码托管网站就认为此操作是账户所有者的操作。比如:
如果本地设定的user.email值是:personal@126.com,由于在GitHub上的账户的邮件地址也是personal@126.com,如果从这台电脑push的话,GitHub会认定这次这个push是账户拥有者自己做的,跟直接登录到GitHub,从网站上修改,是相同的,修改人是一样,就是账户拥有者。
如果本地设定的user.email值是:company@company.cn,也能push到GitHub,GitHub会记录这次的修改是另一个人(用户名是company)做的。
另外,还需要注意,user.name和user.email除了设定全局值(--gloabl)之外,还可以在具体的代码目录中设定自己的user.name和user.email值。
user.name和user.email的设定策略就是:设定global值的时候,考虑一下,这台电脑做公司的事多还是自己的事多,比如公司的电脑,明显做公司的事情多,在我们这里最好设定成:user.email = company@company.cn,user.name = company。当我们需要在公司电脑上干点私活的时候,具体的项目目录中,git config user.name "personal"
,git config user.email "personal@126.com"
,把值改成符合自己要求的。
总结
ssh-keygen产生的秘钥对,每台电脑有一对就够了,有些博客指导一台电脑配置多个密钥对,必要性不强。
代码托管网站上,推荐用电脑本身相关信息来做秘钥对的标题。在本地生成ssh密钥对时也推荐用这个信息来做密钥对的注释。
配置本地git用户名时,全局配置(--global)考虑该电脑上的工作主要push到哪个服务器,配置成跟那个服务器一致的用户名和邮件地址最好。
如果出了主要push的服务器外,这台电脑上的工作还需要push到其他服务器,那么在具体的项目目录下,把用户名和邮件地址配置成和特定的服务器相同即可。