背景:
在一台Mac电脑上有时候为了切换不同的身份我们需要用不同的身份做一些事情,但一般我们登陆Mac时只会使用同一个用户来操作Mac,来回切用户也不是很方便。比如现在我用公司邮箱注册的身份管理公司的项目,然后自己的私有项目想用私有邮箱注册的账号管理,这种事情往往会发生在git管理的项目上。
为了完全区别的用两种身份使用git,需要注意两种情况:
- 配置不同的ssh
- git 提交时使用不同的作者和邮箱。
- 修改git的提交作者和邮箱
下面针对以上两种情况我们详细得讲解下。
配置不同的ssh
我们访问git服务上托管的工程(下面都会以gitlab为例,其他git托管服务其实都是一样的),可以选择ssh和https两种方式访问。如下图:
那么两种方式有什么不同的呢,用ssh会更加方便些,因为你可以通过ssh和git服务器简历安全的身份识别,这样就不用每次进行git操作时输入账号和密码了。
对于SSH,其实是一种加密的网络传输协议,一般git托管服务都支持。ssh会有一对私钥和公钥,我们会把公钥保存到git托管的服务器上。
那么如何生成ssh呢?一般的gitlab上都有对应的说明。这里我简单归纳下:
- 打开终端,输入命令
ssh-keygen -o -t rsa -b 4096 -C "email@example.com"
,将命令中的email@example.com替换成你自己的邮箱,比如gongSiHuaMing@gongSiYuMing.com,然后回车。 - 回车后会终端会提示你
Enter file in which to save the key (/Users/MRzhao/.ssh/id_rsa):
这是提示你保存的公私钥的地址,默认是在/Users/MRzhao/.ssh/id_rsa,可以直接回车,然后会提示你Enter passphrase
这里不要设置密码,直接回车,出现Enter same passphrase again:
,继续回车,顺利的话,终端会提示你私钥和秘钥保存呢成功了,我们在~/.ssh/
目录下回看到两个文件:id_rsa
(私钥),id_rsa.pub
(公钥), - 我们需要把
id_rsa.pub
中的所有内容拷贝出来,然后粘贴到gitlab上的ssh添加列表中(gitlab上ssh的添加列表位置:账号头像--->setting--->找到🔑图标,点击ssh keys)按照提示添加进去就行了。
顺利的话,你就可以直接用ssh协议来访问你的项目了,比如我们git clone时就可以直接用ssh协议地址等,而且不用登陆gitlab账号、密码。
但是如果我们之前有已经存在过id_rsa怎么办呢,在Enter file in which to save the key (~/.ssh/id_rsa):
这一步,如果我们要覆盖掉旧的公私钥就直接回车,然后终端会提示~/.ssh/id_rsa already exists Overwrite (y/n)
,y代表覆盖,n代表不会覆盖。那么我们既要保留旧的又要创建一个新的怎么办呢?回到我们问题的场景,我之前的公私钥是服务公司的git托管服务的,现在我要创建一个自己的公私钥怎么办呢?我们在Enter file in which to save the key (~/.ssh/id_rsa):
时输入我们自己的公私钥地址,比如公司的保存在~/.ssh/id_rsa
,我们可以设置自己的为~/.ssh/my_id_rsa
,然后重复步骤2,顺利的话,我们在~/.ssh目录下会看到my_id_rsa和my_id_rsa.pub两个文件,我们my_id_rsa.pub文件的内容粘贴到自己账号的gitlab上的ssh列表中就行了。
4.但是还没有完,ssh服务器默认是去找id_rsa
,现在需要把这个key添加到ssh-agent中,这样ssh服务器才能认识my_id_rsa
,在终端执行ssh-add -K ~/.ssh/my_id_rsa
指令。(这里为什么加上了一个-K参数呢?因为在Mac上,当系统重启后会“忘记”这个密钥,所以通过指定-K把SSH key导入到密钥链中。),查看添加结果:ssh-add -l
5.编辑配置文件~/.ssh/config
Host gongSiTuoGuanDiZhi.com
Hostname gongSiTuoGuanDiZhi.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Host gitlab.com
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/my_id_rsa
参数说明:
- Host分别为公司自己的gitlab托管的服务地址(一般公司都有自己的git托管服务)
- Hostname,随便起
- User,随便
- PreferredAuthentications,写死publickey
- IdentityFile,公钥地址。
注,如果我们用的id_rsa添加在了过个git托管服务器,比如github,我们只要再添加github的配置就行了
Host github.com
Hostname ssh.github.com
Port 443
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
- 测试配置。执行下面的指令
ssh -T gitlab.com (就是刚刚你给HostName)
,顺利的话终端会提示You've successfully authenticated, but GitHub does not provide shell access.
这样第一个问题算是解决了,我们可以用公司的账号登陆公司的git服务,用自己的账号登陆gitlab来实现公司和自己私有项目的管理了。但是使用git的时候我们每次提交的作者都是同一个人,这样也会造成困扰,我们理想的情况是,对公司的项目提交我们的作者和邮箱都是用公司里的名字,而对于自己的私有项目可以用昵称和自己的邮箱。
也就是说我们如何在不同的工程里配置不同的提交者信息呢?
git配置不同的作者和邮箱。
git可以管理多个项目,每个git管理的项目都有一个config文件,我们可以直接在不同的项目目录下执行:
git config user.name "your name"
git config user.email "your name"
这样就可以更该提交作者和邮箱了
当然git也有一个全局环境的配置:
git config --global user.name "your name"
git config --global user.email "your email"
这样,其他工程里,默认就会使用全局的配置,在~/.gitconfig里我们可以看到配置信息。
但是,如果之前使用默认git config --global的配置提交了自己私有工程的代码,即使后面我们在自己私有工程里配置了git config的作者和邮箱信息,之前的提交依然是全局的默认配置,那么问题来了,如何修改之前已经提交过的作者信息呢?
修改git的提交作者和邮箱
比如现在我们有A-->B--->C--->D,顺次的提交,A和D次提交我们用的是新的作者和邮箱,BC次用的是旧版的地址和邮箱。一个方法是通过git rebase合并掉B和C两次的提交到A。
那么我们可以执行git rebase -i HEAD~n
指令,这里的n需要替换成3,表示当前节点(D)到B之间,输入命令后,会显示
pick ac0fcc6 add file2
pick a0cbfbe add file3
pick 16ee6eb add file4
# Rebase d57f11f..16ee6eb onto d57f11f (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
修改第2行和第3行的pick为edit或e保存退出。保存上面的修改并退出后,git 会依次执行上面的操作,当操作为 pick 时,直接 commit。当操作为 edit 时,会中断,并提示以下信息:
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
这里的意思是说,你可以使用 git commit --amend 来修改此次提交,修改以后,觉得满意了,执行 git rebase --continue 继续剩下的流程。
由于我们的主要目的是修改提交者的信息,因此光用 git commit --amend 是不够的,我们要使用 git commit --amend --author "更改后的作者 genggai@email.com" 这样的操作,这一点是修改提交者信息的关键所在。
使用上面的命令成功修改此次提交的提交者信息后,一定要记得执行 git rebase --continue 继续。
最终完成以后提示如下:
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
这样我们就批量改动作者了。但是这个方法永远改动不了第一次提交的作者,你会发现git rebase -i HEAD~n
指令的时候你永远改动不了第一条提交的信息,而且如果我想改动所有提交历史的作者怎么办?
很简单,按照官方的几个命令就可以完成了Changing author info
注:在执行git push -u origin master -f
,时遇到GitLab: You are not allowed to force push code to a protected branch on this project.
错误,原因是你将master分支设置成了protected分支,git服务器可以修改master分支的状态的,改成非protected状态,进行提交然后再改回来就OK了。
参考:Changing author info
同一个Mac,配置多个SSH Key
Gitlab强制推送提示"You are not allowed to force push code to a protected branch on this project."