背景:
在一臺(tái)Mac電腦上有時(shí)候?yàn)榱饲袚Q不同的身份我們需要用不同的身份做一些事情,但一般我們登陸Mac時(shí)只會(huì)使用同一個(gè)用戶來操作Mac,來回切用戶也不是很方便。比如現(xiàn)在我用公司郵箱注冊(cè)的身份管理公司的項(xiàng)目,然后自己的私有項(xiàng)目想用私有郵箱注冊(cè)的賬號(hào)管理,這種事情往往會(huì)發(fā)生在git管理的項(xiàng)目上。
為了完全區(qū)別的用兩種身份使用git,需要注意兩種情況:
- 配置不同的ssh
- git 提交時(shí)使用不同的作者和郵箱。
- 修改git的提交作者和郵箱
下面針對(duì)以上兩種情況我們?cè)敿?xì)得講解下。
配置不同的ssh
我們?cè)L問git服務(wù)上托管的工程(下面都會(huì)以gitlab為例,其他git托管服務(wù)其實(shí)都是一樣的),可以選擇ssh和https兩種方式訪問。如下圖:
那么兩種方式有什么不同的呢,用ssh會(huì)更加方便些,因?yàn)槟憧梢酝ㄟ^ssh和git服務(wù)器簡歷安全的身份識(shí)別,這樣就不用每次進(jìn)行g(shù)it操作時(shí)輸入賬號(hào)和密碼了。
對(duì)于SSH,其實(shí)是一種加密的網(wǎng)絡(luò)傳輸協(xié)議,一般git托管服務(wù)都支持。ssh會(huì)有一對(duì)私鑰和公鑰,我們會(huì)把公鑰保存到git托管的服務(wù)器上。
那么如何生成ssh呢?一般的gitlab上都有對(duì)應(yīng)的說明。這里我簡單歸納下:
- 打開終端,輸入命令
ssh-keygen -o -t rsa -b 4096 -C "email@example.com"
,將命令中的email@example.com替換成你自己的郵箱,比如gongSiHuaMing@gongSiYuMing.com,然后回車。 - 回車后會(huì)終端會(huì)提示你
Enter file in which to save the key (/Users/MRzhao/.ssh/id_rsa):
這是提示你保存的公私鑰的地址,默認(rèn)是在/Users/MRzhao/.ssh/id_rsa,可以直接回車,然后會(huì)提示你Enter passphrase
這里不要設(shè)置密碼,直接回車,出現(xiàn)Enter same passphrase again:
,繼續(xù)回車,順利的話,終端會(huì)提示你私鑰和秘鑰保存呢成功了,我們?cè)?code>~/.ssh/目錄下回看到兩個(gè)文件:id_rsa
(私鑰),id_rsa.pub
(公鑰), - 我們需要把
id_rsa.pub
中的所有內(nèi)容拷貝出來,然后粘貼到gitlab上的ssh添加列表中(gitlab上ssh的添加列表位置:賬號(hào)頭像--->setting--->找到??圖標(biāo),點(diǎn)擊ssh keys)按照提示添加進(jìn)去就行了。
順利的話,你就可以直接用ssh協(xié)議來訪問你的項(xiàng)目了,比如我們git clone時(shí)就可以直接用ssh協(xié)議地址等,而且不用登陸gitlab賬號(hào)、密碼。
但是如果我們之前有已經(jīng)存在過id_rsa怎么辦呢,在Enter file in which to save the key (~/.ssh/id_rsa):
這一步,如果我們要覆蓋掉舊的公私鑰就直接回車,然后終端會(huì)提示~/.ssh/id_rsa already exists Overwrite (y/n)
,y代表覆蓋,n代表不會(huì)覆蓋。那么我們既要保留舊的又要?jiǎng)?chuàng)建一個(gè)新的怎么辦呢?回到我們問題的場景,我之前的公私鑰是服務(wù)公司的git托管服務(wù)的,現(xiàn)在我要?jiǎng)?chuàng)建一個(gè)自己的公私鑰怎么辦呢?我們?cè)?code>Enter file in which to save the key (~/.ssh/id_rsa):時(shí)輸入我們自己的公私鑰地址,比如公司的保存在~/.ssh/id_rsa
,我們可以設(shè)置自己的為~/.ssh/my_id_rsa
,然后重復(fù)步驟2,順利的話,我們?cè)趡/.ssh目錄下會(huì)看到my_id_rsa和my_id_rsa.pub兩個(gè)文件,我們my_id_rsa.pub文件的內(nèi)容粘貼到自己賬號(hào)的gitlab上的ssh列表中就行了。
4.但是還沒有完,ssh服務(wù)器默認(rèn)是去找id_rsa
,現(xiàn)在需要把這個(gè)key添加到ssh-agent中,這樣ssh服務(wù)器才能認(rèn)識(shí)my_id_rsa
,在終端執(zhí)行ssh-add -K ~/.ssh/my_id_rsa
指令。(這里為什么加上了一個(gè)-K參數(shù)呢?因?yàn)樵贛ac上,當(dāng)系統(tǒng)重啟后會(huì)“忘記”這個(gè)密鑰,所以通過指定-K把SSH key導(dǎo)入到密鑰鏈中。),查看添加結(jié)果: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
參數(shù)說明:
- Host分別為公司自己的gitlab托管的服務(wù)地址(一般公司都有自己的git托管服務(wù))
- Hostname,隨便起
- User,隨便
- PreferredAuthentications,寫死publickey
- IdentityFile,公鑰地址。
注,如果我們用的id_rsa添加在了過個(gè)git托管服務(wù)器,比如github,我們只要再添加github的配置就行了
Host github.com
Hostname ssh.github.com
Port 443
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
- 測(cè)試配置。執(zhí)行下面的指令
ssh -T gitlab.com (就是剛剛你給HostName)
,順利的話終端會(huì)提示You've successfully authenticated, but GitHub does not provide shell access.
這樣第一個(gè)問題算是解決了,我們可以用公司的賬號(hào)登陸公司的git服務(wù),用自己的賬號(hào)登陸gitlab來實(shí)現(xiàn)公司和自己私有項(xiàng)目的管理了。但是使用git的時(shí)候我們每次提交的作者都是同一個(gè)人,這樣也會(huì)造成困擾,我們理想的情況是,對(duì)公司的項(xiàng)目提交我們的作者和郵箱都是用公司里的名字,而對(duì)于自己的私有項(xiàng)目可以用昵稱和自己的郵箱。
也就是說我們?nèi)绾卧诓煌墓こ汤锱渲貌煌奶峤徽咝畔⒛兀?/p>
git配置不同的作者和郵箱。
git可以管理多個(gè)項(xiàng)目,每個(gè)git管理的項(xiàng)目都有一個(gè)config文件,我們可以直接在不同的項(xiàng)目目錄下執(zhí)行:
git config user.name "your name"
git config user.email "your name"
這樣就可以更該提交作者和郵箱了
當(dāng)然git也有一個(gè)全局環(huán)境的配置:
git config --global user.name "your name"
git config --global user.email "your email"
這樣,其他工程里,默認(rèn)就會(huì)使用全局的配置,在~/.gitconfig里我們可以看到配置信息。
但是,如果之前使用默認(rèn)git config --global的配置提交了自己私有工程的代碼,即使后面我們?cè)谧约核接泄こ汤锱渲昧薵it config的作者和郵箱信息,之前的提交依然是全局的默認(rèn)配置,那么問題來了,如何修改之前已經(jīng)提交過的作者信息呢?
修改git的提交作者和郵箱
比如現(xiàn)在我們有A-->B--->C--->D,順次的提交,A和D次提交我們用的是新的作者和郵箱,BC次用的是舊版的地址和郵箱。一個(gè)方法是通過git rebase合并掉B和C兩次的提交到A。
那么我們可以執(zhí)行git rebase -i HEAD~n
指令,這里的n需要替換成3,表示當(dāng)前節(jié)點(diǎn)(D)到B之間,輸入命令后,會(huì)顯示
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 會(huì)依次執(zhí)行上面的操作,當(dāng)操作為 pick 時(shí),直接 commit。當(dāng)操作為 edit 時(shí),會(huì)中斷,并提示以下信息:
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
這里的意思是說,你可以使用 git commit --amend 來修改此次提交,修改以后,覺得滿意了,執(zhí)行 git rebase --continue 繼續(xù)剩下的流程。
由于我們的主要目的是修改提交者的信息,因此光用 git commit --amend 是不夠的,我們要使用 git commit --amend --author "更改后的作者 genggai@email.com" 這樣的操作,這一點(diǎn)是修改提交者信息的關(guān)鍵所在。
使用上面的命令成功修改此次提交的提交者信息后,一定要記得執(zhí)行 git rebase --continue 繼續(xù)。
最終完成以后提示如下:
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
這樣我們就批量改動(dòng)作者了。但是這個(gè)方法永遠(yuǎn)改動(dòng)不了第一次提交的作者,你會(huì)發(fā)現(xiàn)git rebase -i HEAD~n
指令的時(shí)候你永遠(yuǎn)改動(dòng)不了第一條提交的信息,而且如果我想改動(dòng)所有提交歷史的作者怎么辦?
很簡單,按照官方的幾個(gè)命令就可以完成了Changing author info
注:在執(zhí)行git push -u origin master -f
,時(shí)遇到GitLab: You are not allowed to force push code to a protected branch on this project.
錯(cuò)誤,原因是你將master分支設(shè)置成了protected分支,git服務(wù)器可以修改master分支的狀態(tài)的,改成非protected狀態(tài),進(jìn)行提交然后再改回來就OK了。
參考:Changing author info
同一個(gè)Mac,配置多個(gè)SSH Key
Gitlab強(qiáng)制推送提示"You are not allowed to force push code to a protected branch on this project."