背景
公司最近將代碼由svn遷移到了gitlab來托管,我個人平時也經常使用Github,可是公司郵箱與我的Github使用的郵箱是不同的,SSH Key是由郵箱來生成的,這樣子就造成了沖突,本文記錄了解決此類問題的方案。
- 公司GitLab服務郵箱 zhouyang@xxx.com
- 個人GitHub服務郵箱 lyzhou1107@163.com
解決方案
使用 git config
工具,對不同的域名采用不同的認證密鑰。
-
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
文件,將公司項目配置到各自的項目工作目錄。 - /etc/gitconfig
-
配置用戶名、郵箱
- 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"
-
生成SSH Key
mac上SSH 公鑰默認儲存在賬戶的主目錄下的 ~/.ssh
目錄。
$ cd ~/.ssh
$ ls
id_dsa d_dsa.pub known_hosts
關鍵是看有沒有用 something
和 something.pub
來命名的一對文件,這個 something
通常就是 id_dsa
或 id_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.pub
和id_rsa.gitlab.pub
文件就是給github和gitlab使用的公鑰。
-
配置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
密鑰進行驗證。
-
設置github和gitlab公鑰
以github為例:
- 登錄https://github.com/
- 點擊右上角個人頭像圖標,然后點擊Settings選項
- 選擇SSH and GPG keys選項,然后點擊右上角New SSH key按鈕
- Title填上自定義的名字方便區分即可,然后打開
~/.ssh/id_rsa_github.pub
文件,將文件的所有內容copy粘貼到key對應的文本域即可
由于每個公司的gitlab菜單項可能不一樣就不舉例子了。
-
驗證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