咱們在工做中會以 ssh 的方式配置公司的 git 帳號,可是平時也會使用 github 管理本身的項目。出於各類緣由,本身的 github 項目沒法使用公司的 git 帳號,因而咱們能夠爲本身的 github 建立一個新的 git 帳號,這就須要生成新的 ssh 密鑰。 下面總結了建立多個互相獨立的 ssh 密鑰的步驟(以公司的和本身 github 的爲例)。linux
在文件夾 ~/.ssh/
下建立兩個文件夾,分別爲 company/
和 github/
,前者存放公司的 ssh密鑰,後者存本身github 的 ssh 密鑰。下面的步驟以建立 github 密鑰爲例:git
在終端執行命令:ssh-keygen -t rsa -C "your_github_email@example.com"
github
而後會提示 Enter file in which to save the key
,輸入文件路徑 ~/.ssh/github/id_rsa_github
,最後就會在該路徑下生成 id_rsa_github
和 id_rsa_github.pub
兩個文件(若直接回車的話,會保存在~/.ssh/
文件夾中)。shell
而後出現 Enter passphrase (empty for no passphrase)
,直接回車便可。緩存
最後會出現建立成功的提示:bash
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 密鑰 的過程相似,再也不贅述。ide
兩個 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
複製代碼
配置文件的位置:上面咱們在 ~/.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
是兩個很是好用的命令,可查閱相關資料瞭解。用戶名@主機名 當前路徑 $
或 主機名:當前路徑 用戶名$
的格式顯示,其中主機名能夠用命令 scutil –-set HostName new_hostname
設置。git remote add origin 項目地址
,改變命令爲 git remote set-url origin 項目地址
。其中項目地址的格式爲 ssh 或 https。能夠參見文章加以瞭解。