背景
我們在工作中會以 ssh 的方式配置公司的 git 賬號,但是平時也會使用 github 管理自己的專案。出於各種原因,自己的 github 專案無法使用公司的 git 賬號,於是我們可以為自己的 github 建立一個新的 git 賬號,這就需要生成新的 ssh 金鑰。 下面總結了建立多個互相獨立的 ssh 金鑰的步驟(以公司的和自己 github 的為例)。
步驟(以mac為例)
-
在資料夾
~/.ssh/
下建立兩個資料夾,分別為company/
和github/
,前者存放公司的 ssh金鑰,後者存自己github 的 ssh 金鑰。下面的步驟以建立 github 金鑰為例: -
在終端執行命令:
ssh-keygen -t rsa -C "your_github_email@example.com"
-
然後會提示
Enter file in which to save the key
,輸入檔案路徑~/.ssh/github/id_rsa_github
,最後就會在該路徑下生成id_rsa_github
和id_rsa_github.pub
兩個檔案(若直接回車的話,會儲存在~/.ssh/
資料夾中)。 -
然後出現
Enter passphrase (empty for no passphrase)
,直接回車即可。 -
最後會出現建立成功的提示:
Your identification has been saved in .ssh_github/id_rsa_github. Your public key has been saved in .ssh_github/id_rsa_github.pub. 複製程式碼
-
檔案
id_rsa_github.pub
中儲存的就是 ssh 公鑰。可以利用命令pbcopy
將其複製到剪貼簿,比如我的命令就是pbcopy < ~/.ssh/github/id_rsa_github.pub
。當然你也可以找到該檔案手動複製。 -
在 github 網站中新增該 ssh 公鑰。
-
建立公司 ssh 金鑰 的過程類似,不再贅述。
-
兩個 ssh 金鑰建立完畢後,在
~/.ssh/
資料夾中建立檔案config
,新增如下內容:# The git info for company Host git.XXX.com # git別名,寫公司的git名字即可 HostName git.XXX.com # git名字,同樣寫公司的git名字 User git # 寫 git 即可 IdentityFile ~/.ssh/company/id_rsa #私鑰路徑,若寫錯會連線失敗 # The git info for github Host github.com # git別名,寫github的git名字即可 HostName github.com # git名字,同樣寫github的git名字 User git # 寫 git 即可 IdentityFile ~/.ssh/github/id_rsa_github #私鑰路徑,若寫錯會連線失敗 複製程式碼
注:配置檔案中各引數含義請參見擴充套件部分
-
網上很多文章說要執行命令
ssh-add
將 IdentityFile 新增到 ssh-agent中,具體到本文中就是執行ssh-add ~/.ssh/company/id_rsa
和ssh-add ~/.ssh/github/id_rsa_github
。其實這個操作只是把專用金鑰新增到 ssh-agent 的快取記憶體中,因此略過該步驟也不會有影響。 -
這一步用於驗證是否配置成功,以 github 為例,輸入
ssh -T git@github.com
,若出現Hi xiaoxi666! You've successfully authenticated, but GitHub does not provide shell access. 複製程式碼
這樣的欄位,即說明配置成功。公司的同理。
總結
本文描述了單機配置兩個 git 平臺ssh金鑰的方法,多個賬號同理。推薦在 ~/.ssh/
資料夾下為不同的平臺建立不同的資料夾,方便管理。根據上述配置,我的 ~/.ssh/
資料夾下是這樣子的:
├── company
│ ├── id_rsa
│ └── id_rsa.pub
├── config
├── github
│ ├── id_rsa_github
│ └── id_rsa_github.pub
複製程式碼
擴充套件
關於配置檔案 config
-
配置檔案的位置:上面我們在
~/.ssh/
資料夾下建立配置檔案,其實也可以指定位置,具體可查閱 ssh幫助手冊(man 1 ssh
)。-F configfile Specifies an alternative per-user configuration file. If a configuration file is given on the command line, the system-wide configuration file (/etc/ssh/ssh_config) will be ignored. The default for the per-user configuration file is ~/.ssh/config. 複製程式碼
-
Host 別名:可以隨意指定,比如你把 github 的 Host 別名設定為 banana,那你在測試的時候也可以輸入
ssh -T banana
,以後 clone 專案時也可以用 banana 代替 github.com 。 -
User: 注意它和 git 中的 user.name 不是一個概念。
-
配置檔案中的 User 是登入提供 git 服務的平臺(如這裡的 github)的伺服器主機時指定的使用者名稱,比如 github 中 clone 專案時選擇 ssh,連結均以
git@github.com
開頭,@ 前面的 git 就是 github 對應伺服器主機中的一個使用者名稱,即上面設定的 User,@ 後面的 github.com 就是 HostName); -
git 中的 user.name 是用來追蹤程式碼的,提交程式碼時顯示的作者名字就是它,比如在 github 中,我的 user.name 就是 xiaoxi666。這裡引出了另外一個問題:**我在本機中配置了多個 git 賬號,如何在不同的專案中自動切換不同的作者名字?**比如我在公司的程式碼庫裡提交程式碼時,用的就是另外一個名字而非 xiaoxi666。這部分內容涉及到了 git 的配置(可以在終端輸入
git config --help
檢視官方說明),你一定有過下面這種配置的經歷:git config --global user.name "user_name" git config --global user.email "user_name@example.com" 複製程式碼
實際上,git 有三種配置選項,分別對應於 --system 、--global、--local,上面就是 --global選項。三種配置選項分別對應於三個配置檔案:
--system -> /usr/local/git/etc/gitconfig --global -> ~/.gitconfig --local -> 你的專案倉庫路徑/.git/config 複製程式碼
這三種配置檔案的優先順序由低到高為:--system、--global、--local,優先順序高的配置會覆蓋優先順序低的配置。一般情況下,我們不會去設定 --system 選項,主要用的是 --global 和 --local。正如網上滿天飛的教程中,我們一般會設定 --global,這樣就不用在每個專案中設定一遍了;但是如果配置了多個 git 賬號,需要在一些專案中使用不同的作者名字,就需要單獨為該專案設定 --local。需要注意的是, --local 選項只能 cd 到當前專案路徑下中執行,否則會報錯 fatal: --local can only be used inside a git repository。
注一:如果 --system、--global、--local 都沒有設定 user.email,將無法提交程式碼,因為無法識別程式碼作者。在設定了 user.email 的前提下,如果 --system、--global、--local 都沒有設定 user.name,則會使用計算機登入使用者名稱作為程式碼提交的作者名字。 注二:設定 --local 時記得同時設定 user.name 和 user.email,如果只設定 user.name,提交名字雖然正確了,但 user.email 還是用的 --global 中的 user.email,這會導致 github 倉庫中顯示的提交者卻不會連結到你的賬號:頭像是灰色的八爪魚,名字也沒有連結。
-
-
配置檔案可指定的引數還有很多,如埠等,這裡我們直接使用預設埠 22,因此沒有再去指定。
其他
pbcopy
和pbpaste
是兩個非常好用的命令,可查閱相關資料瞭解。- 文章 man.linuxde.net/ssh-add 描述了 linux 的 ssh-add 命令,講得不錯。
- mac 分別有使用者名稱、主機名(HostName),以及計算機名。其中計算機名可以在 "System Preference" -> "sharing" 中設定,是分享時展示的名字;我們開啟終端時,會以
使用者名稱@主機名 當前路徑 $
或主機名:當前路徑 使用者名稱$
的格式顯示,其中主機名可以用命令scutil –-set HostName new_hostname
設定。 - 有時我們需要新增或改變遠端倉庫的地址,新增命令為:
git remote add origin 專案地址
,改變命令為git remote set-url origin 專案地址
。其中專案地址的格式為 ssh 或 https。可以參見文章加以瞭解。