背景:
在一臺Mac電腦上有時候為了切換不同的身份我們需要用不同的身份做一些事情利耍,但一般我們登陸Mac時只會使用同一個用戶來操作Mac拨扶,來回切用戶也不是很方便糊余。比如現(xiàn)在我用公司郵箱注冊的身份管理公司的項目焊唬,然后自己的私有項目想用私有郵箱注冊的賬號管理,這種事情往往會發(fā)生在git管理的項目上豫缨。
為了完全區(qū)別的用兩種身份使用git,需要注意兩種情況:
- 配置不同的ssh
- git 提交時使用不同的作者和郵箱端朵。
- 修改git的提交作者和郵箱
下面針對以上兩種情況我們詳細得講解下好芭。
配置不同的ssh
我們訪問git服務上托管的工程(下面都會以gitlab為例,其他git托管服務其實都是一樣的)冲呢,可以選擇ssh和https兩種方式訪問舍败。如下圖:
那么兩種方式有什么不同的呢,用ssh會更加方便些敬拓,因為你可以通過ssh和git服務器簡歷安全的身份識別邻薯,這樣就不用每次進行git操作時輸入賬號和密碼了。
對于SSH,其實是一種加密的網(wǎng)絡傳輸協(xié)議乘凸,一般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
這里不要設置密碼客年,直接回車,出現(xiàn)Enter same passphrase again:
,繼續(xù)回車漠吻,順利的話量瓜,終端會提示你私鑰和秘鑰保存呢成功了,我們在~/.ssh/
目錄下回看到兩個文件:id_rsa
(私鑰)途乃,id_rsa.pub
(公鑰), - 我們需要把
id_rsa.pub
中的所有內容拷貝出來绍傲,然后粘貼到gitlab上的ssh添加列表中(gitlab上ssh的添加列表位置:賬號頭像--->setting--->找到??圖標,點擊ssh keys)按照提示添加進去就行了耍共。
順利的話烫饼,你就可以直接用ssh協(xié)議來訪問你的項目了,比如我們git clone時就可以直接用ssh協(xié)議地址等试读,而且不用登陸gitlab賬號杠纵、密碼。
但是如果我們之前有已經(jīng)存在過id_rsa怎么辦呢钩骇,在Enter file in which to save the key (~/.ssh/id_rsa):
這一步比藻,如果我們要覆蓋掉舊的公私鑰就直接回車铝量,然后終端會提示~/.ssh/id_rsa already exists Overwrite (y/n)
,y代表覆蓋银亲,n代表不會覆蓋慢叨。那么我們既要保留舊的又要創(chuàng)建一個新的怎么辦呢?回到我們問題的場景群凶,我之前的公私鑰是服務公司的git托管服務的插爹,現(xiàn)在我要創(chuàng)建一個自己的公私鑰怎么辦呢?我們在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
,現(xiàn)在需要把這個key添加到ssh-agent中术幔,這樣ssh服務器才能認識my_id_rsa
,在終端執(zhí)行ssh-add -K ~/.ssh/my_id_rsa
指令元咙。(這里為什么加上了一個-K參數(shù)呢梯影?因為在Mac上,當系統(tǒng)重啟后會“忘記”這個密鑰庶香,所以通過指定-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
參數(shù)說明:
- 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
- 測試配置膳灶。執(zhí)行下面的指令
ssh -T gitlab.com (就是剛剛你給HostName)
,順利的話終端會提示You've successfully authenticated, but GitHub does not provide shell access.
這樣第一個問題算是解決了咱士,我們可以用公司的賬號登陸公司的git服務,用自己的賬號登陸gitlab來實現(xiàn)公司和自己私有項目的管理了轧钓。但是使用git的時候我們每次提交的作者都是同一個人司致,這樣也會造成困擾,我們理想的情況是聋迎,對公司的項目提交我們的作者和郵箱都是用公司里的名字脂矫,而對于自己的私有項目可以用昵稱和自己的郵箱。
也就是說我們如何在不同的工程里配置不同的提交者信息呢霉晕?
git配置不同的作者和郵箱庭再。
git可以管理多個項目捞奕,每個git管理的項目都有一個config文件,我們可以直接在不同的項目目錄下執(zhí)行:
git config user.name "your name"
git config user.email "your name"
這樣就可以更該提交作者和郵箱了
當然git也有一個全局環(huán)境的配置:
git config --global user.name "your name"
git config --global user.email "your email"
這樣拄轻,其他工程里颅围,默認就會使用全局的配置,在~/.gitconfig里我們可以看到配置信息恨搓。
但是院促,如果之前使用默認git config --global的配置提交了自己私有工程的代碼,即使后面我們在自己私有工程里配置了git config的作者和郵箱信息斧抱,之前的提交依然是全局的默認配置常拓,那么問題來了,如何修改之前已經(jīng)提交過的作者信息呢?
修改git的提交作者和郵箱
比如現(xiàn)在我們有A-->B--->C--->D辉浦,順次的提交弄抬,A和D次提交我們用的是新的作者和郵箱,BC次用的是舊版的地址和郵箱宪郊。一個方法是通過git rebase合并掉B和C兩次的提交到A掂恕。
那么我們可以執(zhí)行git rebase -i HEAD~n
指令,這里的n需要替換成3弛槐,表示當前節(jié)點(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 會依次執(zhí)行上面的操作,當操作為 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 來修改此次提交鸠匀,修改以后蕉斜,覺得滿意了,執(zhí)行 git rebase --continue 繼續(xù)剩下的流程缀棍。
由于我們的主要目的是修改提交者的信息宅此,因此光用 git commit --amend 是不夠的,我們要使用 git commit --amend --author "更改后的作者 genggai@email.com" 這樣的操作爬范,這一點是修改提交者信息的關鍵所在父腕。
使用上面的命令成功修改此次提交的提交者信息后,一定要記得執(zhí)行 git rebase --continue 繼續(xù)青瀑。
最終完成以后提示如下:
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
這樣我們就批量改動作者了璧亮。但是這個方法永遠改動不了第一次提交的作者萧诫,你會發(fā)現(xiàn)git rebase -i HEAD~n
指令的時候你永遠改動不了第一條提交的信息,而且如果我想改動所有提交歷史的作者怎么辦枝嘶?
很簡單帘饶,按照官方的幾個命令就可以完成了Changing author info
注:在執(zhí)行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分支的狀態(tài)的,改成非protected狀態(tài)竞阐,進行提交然后再改回來就OK了缴饭。
參考:Changing author info
同一個Mac,配置多個SSH Key
Gitlab強制推送提示"You are not allowed to force push code to a protected branch on this project."