Git的多SSH Key解決方案(macOS)

背景

公司最近將代碼由svn遷移到了gitlab來托管,我個人平時也經常使用Github,可是公司郵箱與我的Github使用的郵箱是不同的,SSH Key是由郵箱來生成的,這樣子就造成了沖突,本文記錄了解決此類問題的方案。

解決方案

使用 git config工具,對不同的域名采用不同的認證密鑰。

  1. git config介紹

    Git 提供了一個叫做 git config 的工具,專門用來配置或讀取相應的工作環境變量。而正是由這些環境變量,決定了 Git 在各個環節的具體工作方式和行為。這些變量可以存放在以下三個不同的地方:

    • /etc/gitconfig文件:系統中對所有用戶都普遍適用的配置。若使用git config時用--system` 選項,讀寫的就是這個文件。
    • ~/.gitconfig 文件:用戶目錄下的配置文件只適用于該用戶。若使用 git config 時用 --global 選項,讀寫的就是這個文件。
    • 當前項目的 Git 目錄中的配置文件(也就是工作目錄中的 .git/config 文件):這里的配置僅僅針對當前項目有效。每一個級別的配置都會覆蓋上層的相同配置,所以 .git/config 里的配置會覆蓋 /etc/gitconfig 中的同名變量。

    由于經常使用GitHub看一些開源項目,相對公司的GitLab項目來說還是多一些的,所以將GitHub的配置到~/.gitconfig 文件,將公司項目配置到各自的項目工作目錄。

  2. 配置用戶名、郵箱

  • GitHub配置
    $ git config --global user.name "zhouyang-cn"
    $ git config --global user.email "lyzhou1107@163.com"
    
  • GitLab配置
    進入項目的根目錄
    $ git config user.name "zhouyang"
    $ git config user.email "zhouyang@xxx.com"
    
  1. 生成SSH Key

mac上SSH 公鑰默認儲存在賬戶的主目錄下的 ~/.ssh 目錄。

$ cd ~/.ssh
$ ls
id_dsa d_dsa.pub known_hosts

關鍵是看有沒有用 somethingsomething.pub 來命名的一對文件,這個 something 通常就是 id_dsaid_rsa。有 .pub 后綴的文件就是公鑰,另一個文件則是密鑰。假如沒有這些文件,或者干脆連 .ssh 目錄都沒有,可以用 ssh-keygen 來創建。

localhost:~ zhouyang$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/zhouyang/.ssh/id_rsa): 直接敲enter鍵
Enter passphrase (empty for no passphrase): 直接敲enter鍵
Enter same passphrase again: 直接敲enter鍵
Your identification has been saved in /Users/zhouyang/.ssh/id_rsa.
Your public key has been saved in /Users/zhouyang/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bg5l5i95JIYr9ovvWbPPlAaa2kGljKcBJuu16YTbqBw zhouyang@localhost
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|. o     .        |
| + . o o         |
|.  .o =.S        |
|. o o=.Oo...     |
| E +. =o*++      |
|. B o+.BoB.      |
|o+ +o=B.o++      |
+----[SHA256]-----+

通過上面的操作會在賬戶的主目錄下生成 ~/.ssh 目錄,并在目錄內生成id_rsa(私鑰,切記不要泄露)和id_rsa.pub(公鑰)文件。

  • 生成GitHub的SSH公鑰

    ssh-keygen -t rsa -f ~/.ssh/id_rsa.github -C "lyzhou1107@163.com"
    
  • 生成GitLib的SSH公鑰

    ssh-keygen -t rsa -f ~/.ssh/id_rsa.gitlab -C "zhouyang@xxx.com"
    

命令執行完成后,這時~/.ssh目錄下會多出id_rsa.github.pubid_rsa.gitlab.pub文件就是給github和gitlab使用的公鑰。

  1. 配置config文件

通過touch ~/.ssh/config命令創建config文件,修改文件內容如下:

#
# github
#
Host github.com
IdentityFile ~/.ssh/id_rsa_github

#
# company gitlab
#
Host git.company.com
IdentityFile ~/.ssh/id_rsa_gitlab

配置完成以后,github的倉庫會使用~/.ssh/id_rsa_github密鑰進行驗證,gitlab會使用~/.ssh/id_rsa_gitlab密鑰進行驗證。

  1. 設置github和gitlab公鑰

    以github為例:

    1. 登錄https://github.com/
    2. 點擊右上角個人頭像圖標,然后點擊Settings選項
    3. 選擇SSH and GPG keys選項,然后點擊右上角New SSH key按鈕
    4. Title填上自定義的名字方便區分即可,然后打開~/.ssh/id_rsa_github.pub文件,將文件的所有內容copy粘貼到key對應的文本域即可

    由于每個公司的gitlab菜單項可能不一樣就不舉例子了。

  2. 驗證SSH連接

    打開Terminal,輸入一下命令來校驗:

    ssh -T git@github.com
    

    若看到如下信息,則代表連接成功了:

    Hi zhouyang-cn! You've successfully authenticated, but GitHub does not provide shell access.
    

    若出現問題,可以參考github的文檔

在AS中的Problems and solutions

? 經過上面的配置后,在as里進行代碼修改、commit和push操作時,會出現push失敗的問題,錯誤信息如下:

Failed with error: fatal: Could not read from remote repository

通過google搜索后找出問題產生的原因:

由于AS默認使用的是Built-in(自帶的)進行SSH校驗,而我們上面設置的是mac本機的SSH校驗。所以解決方案如下:

相關文檔:stackoverflow

擴展知識

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容