最近閒得無聊註冊了一個新域名,順便弄了一大堆新賬號(Github、Twitter等),準備來一次徹底的改頭換面。
註冊新域名後第一件事就是弄了這個部落格。註冊Github時發現一個SSH公鑰只能關聯一個Github賬號,使用https的話又要經常輸入密碼。所以只好Google搜尋一下解決方案。順便在這裡留下總結,以便日後檢視。
SSH 配置
首先看一下SSH的配置檔案 ~/.ssh/config
的格式:
Host alias # 該配置的匹配模式
HostName hostname # 遠端主機名
Port port # 遠端主機埠
User user # 連線遠端主機的使用者名稱
IdentityFile key # 改配置使用的金鑰
真實的SSH配置檔案的屬性要比這個多得多,這裡只說幾個等下會用到的。更多的屬性可以參考 這裡 。
<!– more –>
其中:
-
Host
屬性用於確定何時使用該配置,可使用萬用字元,相當於一個別名 -
HostName
為該配置的真實主機名,如過是 Github 的話則為github.com
-
Port
為遠端主機的埠,預設為22
-
User
為連線遠端主機的使用者名稱,在 Github 中為git
-
IdentityFile
為該配置使用的金鑰檔案
例如一個配置檔案如下:
Host world
HostName world.com
Port 2222
User hello
IdentityFile ~/.ssh/world
Host bar
HostName bar.com
User foo
IdentityFile ~/.ssh/bar
如果在終端輸入
ssh world
則相當於在終端輸入了
ssh -p 2222 -i `~/.ssh/world` hello@world.com
如輸入
ssh bar
則相當於輸入
ssh -i `~/.ssh/bar` foo@bar.com
這裡需要多個金鑰,可以通過
ssh-keygen
命令來來生成:
# 在 `~/.ssh/` 目錄下生成私鑰 `world` 和公鑰 `world.pub`
ssh-keygen -t rsa -C "hello@world.com" -f ~/.ssh/world
# 期間會提示輸入密碼,可為空
# 在 `~/.ssh/` 目錄下生成私鑰 `bar` 和公鑰 `bar.pub`
ssh-keygen -t rsa -C "foo@bar.com" -f ~/.ssh/bar
這樣一來,只要寫入多個配置,就可以實現通過不同的別名來使用不同的金鑰去訪問一個遠端主機。從而就可通過為不同的Github賬戶配置不同的別名來達到通過SSH方式在一臺主機上使用多個Github賬號。
為Github編寫SSH配置檔案
先來看一下github的倉庫地址: git@github.com:hardo/blog.git
我們發現github倉庫地址的使用者名稱均為 git
, 主機名均為 github.com
, 每個使用者的倉庫放在同名目錄中。
假如現在有兩個Github賬號 hello
和 hardo
。
先為這兩個賬號生成金鑰:
# 在 `~/.ssh/` 目錄下生成私鑰 `hello` 和公鑰 `hello.pub`
ssh-keygen -t rsa -C "hello@world.com" -f ~/.ssh/hello
# 在 `~/.ssh/` 目錄下生成私鑰 `hardo` 和公鑰 `hardo.pub`
ssh-keygen -t rsa -C "i@hardo.me" -f ~/.ssh/hardo
然後將 hello.pub
檔案裡的內容複製到 Github 賬號 hello
的設定裡,將 hardo.pub
檔案裡的內容複製到 hardo
的設定裡。
在 ~/.ssh/config
檔案裡輸入如下配置資訊:
Host hello.github.com
HostName github.com
User git
IdentityFile ~/.ssh/world
Host hardo.github.com
HostName github.com
User git
IdentityFile ~/.ssh/bar
配置完成後,便可以使用不同的別名來區分不同的使用者:
# 使用 hello 使用者克隆 hello 的 test 倉庫
git clone git@hello.github.com:hello/test.git
# 其中前面的 git 使用者名稱可以省略,
# 但為了便於識別這裡還是加上
# 使用 hello 使用者克隆 hardo 的 blog 倉庫
git clone git@hello.github.com:hardo/blog.git
# 如過沒有許可權的話,將不可推送到預設源
# 使用 hardo 使用者克隆 hardo 的 blog 倉庫
git clone git@hardo.github.com:hardo/blog.git
雖然遠端使用者是沒問題了,但這裡還有一個本地使用者的問題。
如果設定了全域性使用者名稱和郵箱地址,則不論向哪個使用者克隆的倉庫commit程式碼都將是全域性的使用者郵箱所為對應的使用者。這看起來會很奇怪,看起來是兩個使用者,一看commit資訊卻是一個使用者。
我們要做的是刪除Git的全域性使用者配置,為每個倉庫單獨配置使用者。
或者將全域性使用者配置為一個使用者,然後為另一個使用者的所有倉庫新增單獨的本地使用者資訊。
# 取消全域性的使用者配置
git config --global --unset user.name
git config --global --unset user.email
# 進入一個倉庫
git clone git@hardo.github.com:hardo/blog.git
cd blog
# 為倉庫單獨配置使用者
git config user.name `hardo`
git config user.email `i@hardo.me`
在 Hexo 中配置部署資訊
本部落格是用 Hexo
生成的,Hexo 很方便的一項功能就是一條命令列就可以部署到Github pages。在 Hexo 的全域性配置檔案 _config.yml
中可以配置:
deploy:
type: git
repo: git@hardo.github.com:hardo/blog.git
branch: gh-pages
輸入 hexo deploy
,一切正常。但是去看 gh-pages
分支的commit資訊,發現推送者是本地配置的全域性使用者。配置檔案裡可不以改本地使用者博主也不清楚,也懶得去查(懶癌晚期)。不過讓我在 部落格倉庫 的根目錄裡發現了 .deploy_git
目錄,猜想應該是生成後的倉庫。於是去這個目錄下改了本地使用者資訊:
cd .deploy_git
git config user.name `hardo`
git config user.email `i@hardo.me`
改完之後再重新部署,發現果然成功了!
當然,如果你沒有配置全域性使用者的話,第一次部署會失敗。雖然失敗了,但還是會生成
.deploy_git
目錄,進入該目錄改下配置然後再重新部署就行了。