應(yīng)用場景
我們經(jīng)常將代碼托管到github、gitlab這樣的網(wǎng)站上竹观。為了避免每次push代碼時都要輸入用戶名和密碼土辩,通常會選擇使用ssh協(xié)議,將公鑰保存到托管網(wǎng)站上摘符。在實際開發(fā)中贤斜,往往要將代碼托管到多個不同的網(wǎng)站上策吠。比如,公司的代碼需要托管到coding上瘩绒,自己的開源代碼托管到GitHub上猴抹,私有代碼托管到gitlab上等等,每個托管網(wǎng)站都對應(yīng)一個git賬戶锁荔。默認(rèn)情況下蟀给,一臺電腦的Git只對應(yīng)一個賬戶,只能往一個網(wǎng)站push代碼阳堕,非常不便坤溃。這篇博客將介紹如何在一個Git終端中配置多個賬戶,同時管理多個托管網(wǎng)站的代碼嘱丢。
準(zhǔn)備工作
首先薪介,需要準(zhǔn)備好對Git的全局用戶進(jìn)行配置。在初次安裝Git時越驻,往往會使用如下的命令配置全局用戶名和郵箱:
git config --global user.name "xxx" // 配置全局用戶名汁政,如Github上注冊的用戶名
git config --global user.email "yyy@mail.com" // 配置全局郵箱,如Github上配置的郵箱
這個--global
選項缀旁,是指這里配置的user.name
和user.email
是相對于全局進(jìn)行配置的记劈,即不同的Git倉庫默認(rèn)的用戶名和郵箱都是這個值。由于需要管理多個賬戶并巍,所以僅僅使用這個全局值是不夠的目木,需要在每個倉庫中單獨(dú)配置。對此懊渡,有兩種處理方法:
如果之前已經(jīng)使用該命令進(jìn)行配置刽射,則先使用如下命令清除
git config --global --unset user.name
git config --global --unset user.email
如果不確定是否已經(jīng)配置過,可以使用下面的命令查看
git config --global user.name
git config --global user.email
配置步驟
1. 對每個賬戶生成一對密鑰
首先進(jìn)入保存秘鑰的目錄:
cd ~/.ssh // 進(jìn)入目錄剃执,該目錄下保存生成的秘鑰
然后誓禁,根據(jù)賬戶郵箱生成秘鑰。例如我在GitHub上的郵箱是liugui@hust.edu.cn
肾档,則命令為:
ssh-keygen -t rsa -C "liugui@hust.edu.cn"
輸入完成后摹恰,會有如下提示:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/liugui/.ssh/id_rsa):
這里要求對秘鑰進(jìn)行命名,默認(rèn)的文件名是id_rsa
怒见。為了方便區(qū)分俗慈,我這里命名為id_rsa_github
。接下來的提示都直接進(jìn)行回車遣耍,直到秘鑰生成闺阱。通過ls
命令,可以看到剛剛生成的密鑰對id_rsa_github
和id_rsa_github.pub
配阵。其中id_rsa_github.pub
是公鑰馏颂。
同樣,對于GitLab上的賬戶棋傍,我是用另一個郵箱注冊的救拉,按照同樣的步驟生成id_rsa_gitlab
的秘鑰對。接下來的步驟瘫拣,除額外說明外亿絮,兩個賬戶的操作完全相同。
2. 私鑰添加到本地
SSH協(xié)議的原理麸拄,就是在托管網(wǎng)站上使用公鑰派昧,在本地使用私鑰,這樣本地倉庫就可以和遠(yuǎn)程倉庫進(jìn)行通信拢切。在上一步已經(jīng)生成了秘鑰文件蒂萎,接下來需要使用秘鑰文件,首先是在本地使用秘鑰文件:
ssh-add ~/.ssh/id_rsa_github // 將GitHub私鑰添加到本地
ssh-add ~/.ssh/id_rsa_gitlab // 將GitLab私鑰添加到本地
為了檢驗本地是否添加成功淮椰,可以使用ssh-add -l
命令進(jìn)行查看
3. 對本地秘鑰進(jìn)行配置
由于添加了多個密鑰文件五慈,所以需要對這多個密鑰進(jìn)行管理。在.ssh
目錄下新建一個config文件:
touch config
文件中的內(nèi)容如下:
Host github // 網(wǎng)站的別名主穗,隨意取
HostName github.com // 托管網(wǎng)站的域名
User liugui // 托管網(wǎng)站上的用戶名
IdentityFile ~/.ssh/id_rsa_github // 使用的密鑰文件
// GitLab的配置相同
Host gitlab
HostName gitlab.com
User liugui
IdentityFile ~/.ssh/id_rsa_gitlab
4. 公鑰添加到托管網(wǎng)站
以GitHub為例泻拦,先在本地復(fù)制公鑰。進(jìn)入.ssh
目錄忽媒,使用vim id_rsa_github.pub
查看生成的GitHub公鑰争拐,全選進(jìn)行復(fù)制。
登錄GitHub晦雨,點擊右上角頭像選擇settings
架曹,在打開的頁面中選擇SSH and GPG keys,
在打開的頁面的Key輸入框中粘貼剛剛復(fù)制的公鑰闹瞧,title的名字自己隨便去音瓷,然后點擊下方的Add SSH key
按鈕:
至此,托管網(wǎng)站的公鑰添加完成夹抗∩鳎總結(jié)來說,就是針對每個托管網(wǎng)站分別生成一對密鑰漠烧,然后分別添加到本地和托管網(wǎng)站杏愤。
這時候,可以測試一下配置是否成功已脓,測試命令使用別名珊楼。例如,對于GitHub度液,本來應(yīng)該使用的測試命令是:
ssh -T git@github.com
在config文件中厕宗,給GitHub網(wǎng)站配置的別名就是github画舌,所以直接使用別名,就是
ssh -T git@github
如何使用
使用有兩種情況已慢,一種情況是從遠(yuǎn)端拉取代碼到本地曲聂,一種是本地已有倉庫需要與遠(yuǎn)程倉庫關(guān)聯(lián)。
1.如果是從遠(yuǎn)端拉取代碼
選擇SSH協(xié)議的復(fù)制命令佑惠,如對于GitLab上代碼庫test朋腋,其復(fù)制命令為
git clone git@gitlab.com:liugui/test.git
由于使用了別名gitlab,所以實際使用的復(fù)制命令應(yīng)當(dāng)為:
git clone git@gitlab:liugui/test.git
這種方法較為簡單膜楷,修改后的代碼無需額外配置旭咽,可以直接push
2. 如果是本地已有的倉庫
這種情況適用于本地新建的倉庫需要與遠(yuǎn)端進(jìn)行關(guān)聯(lián),或者之前已經(jīng)使用sourceTree等圖形界面軟件拷貝的倉庫赌厅。進(jìn)入本地倉庫文件夾穷绵,需要單獨(dú)配置該倉庫的用戶名和郵箱
git config user.name "liugui"
git config user.email "liugui@hust.edu.cn"
然后,進(jìn)入本地倉庫的git目錄特愿,打開config文件
cd .git // 該目錄是隱藏的请垛,ls命令不可見,但是可以直接進(jìn)入洽议,如果是新建的文件夾需要先執(zhí)行g(shù)it init
vim config
在config文件中宗收,修改(config文件中已有remote "origin"信息)或者添加(config文件中不包含remote "origin"信息)分支信息:
[remote "origin"]
url = git@gitlab:GuiLiu/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
主要是URL部分,原生的信息一般是git@gitlab.com:GuiLiu/test.git
亚兄,需要將gitlab.com使用別名gitlab代替混稽。
可以看到,倉庫中的關(guān)鍵是要配置好用戶名和郵箱审胚,以及使用別名匈勋。使用別名的目的是為了通過別名,將本地倉庫與密鑰目錄.ssh
文件夾下的密鑰進(jìn)行管理膳叨,這樣就完成了本地倉庫使用的私鑰與托管網(wǎng)站使用的公鑰的配對洽洁,而用戶名和郵箱是該倉庫使用SSH協(xié)議時需要用到的信息
補(bǔ)充一下Coding
在關(guān)聯(lián)coding上托管的代碼時,遇到了一點麻煩菲嘴,主要是因為別名的修改不正確饿自,以及20端口禁用的問題導(dǎo)致的,所以單獨(dú)記錄下龄坪,.ssh
目錄下的config文件中的密鑰信息應(yīng)該為:
Host coding
HostName git-ssh.coding.net // 這個域名使用coding官網(wǎng)獲取的昭雌,不能寫coding.net
User liugui
IdentityFile ~/.ssh/id_rsa_coding
Port 443 // 20端口可能被禁用,需要使用443端口
個人博客地址:http://www.liugui.org