同一台Mac上配置多个ssh及git 更改提交作者

背景:

在一台Mac电脑上有时候为了切换不同的身份我们需要用不同的身份做一些事情,但一般我们登陆Mac时只会使用同一个用户来操作Mac,来回切用户也不是很方便。比如现在我用公司邮箱注册的身份管理公司的项目,然后自己的私有项目想用私有邮箱注册的账号管理,这种事情往往会发生在git管理的项目上。
为了完全区别的用两种身份使用git,需要注意两种情况:

  1. 配置不同的ssh
  2. git 提交时使用不同的作者和邮箱。
  3. 修改git的提交作者和邮箱
    下面针对以上两种情况我们详细得讲解下。

配置不同的ssh

我们访问git服务上托管的工程(下面都会以gitlab为例,其他git托管服务其实都是一样的),可以选择ssh和https两种方式访问。如下图:

ssh1.png

那么两种方式有什么不同的呢,用ssh会更加方便些,因为你可以通过ssh和git服务器简历安全的身份识别,这样就不用每次进行git操作时输入账号和密码了。
对于SSH,其实是一种加密的网络传输协议,一般git托管服务都支持。ssh会有一对私钥和公钥,我们会把公钥保存到git托管的服务器上。
那么如何生成ssh呢?一般的gitlab上都有对应的说明。这里我简单归纳下:

  1. 打开终端,输入命令ssh-keygen -o -t rsa -b 4096 -C "email@example.com",将命令中的email@example.com替换成你自己的邮箱,比如gongSiHuaMing@gongSiYuMing.com,然后回车。
  2. 回车后会终端会提示你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(公钥),
  3. 我们需要把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

  1. 测试配置。执行下面的指令ssh -T gitlab.com (就是刚刚你给HostName),顺利的话终端会提示You've successfully authenticated, but GitHub does not provide shell access.

这样第一个问题算是解决了,我们可以用公司的账号登陆公司的git服务,用自己的账号登陆gitlab来实现公司和自己私有项目的管理了。但是使用git的时候我们每次提交的作者都是同一个人,这样也会造成困扰,我们理想的情况是,对公司的项目提交我们的作者和邮箱都是用公司里的名字,而对于自己的私有项目可以用昵称和自己的邮箱。


ssh2.png

也就是说我们如何在不同的工程里配置不同的提交者信息呢?

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."

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

推荐阅读更多精彩内容