由於公司團隊使用 gitlab 來託管**,同時,個人在 github 上還有一些**倉庫,可公司郵箱與個人郵箱是不同的,由此產生的 ssh key 也是不同的,這就造成了衝突 ,如何在一台機器上面同時使用 github 與 gitlab 的服務?
問題產生場景
無密碼與遠端伺服器互動的秘密 - ssh
如果採用ssh 協議或者git 協議通過終端命令對遠端倉庫進行``push```操作的時候,大概的過程如下:(前提在 github 上已經配置的本機的 ssh public key)
客戶端發起乙個 public key 的認證請求,並傳送rsa key的模數作為識別符號。(關於 rsa key 詳細 維基百科)
服務端檢查是否存在請求帳號的公鑰(linux中儲存在~/.ssh/authorized_keys檔案中),以及其擁有的訪問許可權。
服務端使用對應的公鑰對乙個隨機的256位的字串進行加密,並傳送給客戶端。
客戶端使用私鑰對字串進行解密,並將其結合session id生成乙個md5值傳送給服務端。 結合session id的目的是為了避免攻擊者採用重放攻擊(replay attack)。
服務端採用同樣的方式生成md5值與客戶端返回的md5值進行比較,完成對客戶端的認證。
將push的內容進行加密與服務端傳輸資料。
關於 ssh,請檢視 ssh原理簡介 ,更通俗易懂的文章請檢視阮一峰-ssh原理與運用(一):遠端登入 。
具體場景
無論使用哪種**託管服務商,對於 git 而言,郵箱是識別使用者的唯一手段,所以對於不同的服務商,由於郵箱不同,那麼通過郵件名建立的 ssh key 自然是不同的,這時候在不同的服務商之間進行push命令的時候,git 是不知道使用哪個 ssh key ,自然導致 push 的失敗。場景如下:
在公司團隊使用搭建的 gitlab 服務,提交郵箱[email protected], 個人 github 服務,提交郵箱 [email protected] 。
有兩個github賬戶,不同的賬戶提交不同的倉庫內容。
解決方案
方案一:同乙個郵箱
由於郵箱是識別的唯一手段,那麼自然的,這兩者採用同乙個郵箱,生成的 public key 也會是同乙個,上傳到 github 或者 gitlab 上面,在 git 的配置中 ,設定好 global 的配置 :git config --global user.name 『ciqing』 && git config --global user.email 『[email protected]』 進行日常的開發是沒有問題的。
實際生活中採用同乙個郵箱的可能性並不是太大,這就引出了方案二
方案二:基於config檔案
所謂的方案二,原理上就是對 ssh 協議配置 config 檔案,對不同的網域名稱採用不同的認證金鑰。
git config 介紹
git有乙個工具被稱為git config,它允許你獲得和設定配置變數;這些變數可以控制git的外觀和操作的各個方面。這些變數可以被儲存在三個不同的位置:
/etc/gitconfig 檔案:包含了適用於系統所有使用者和所有庫的值。如果你傳遞引數選項』–system』給 git config,它將明確的讀和寫這個檔案。
~/.gitconfig 檔案 :具體到你的使用者。你可以通過傳遞 『–global』 選項使git 讀或寫這個特定的檔案。
位於 git 目錄的 config 檔案 (也就是 .git/config) :無論你當前在用的庫是什麼,特定指向該單一的庫。每個級別重寫前乙個級別的值。因此,在 .git/config 中的值覆蓋了在/etc/gitconfig中的同乙個值,可以通過傳遞『–local』選項使git 讀或寫這個特定的檔案。
由於採用了不同的郵箱,對不同的服務商進行提交,所以此時我們經常配置的git config --global就不能常用了,必須在每個倉庫的目錄下進行配置自己的使用者名稱、郵箱。(嫌麻煩?那麼可以這麼解決,由於個人的 github 上有較多的倉庫,而自己團隊的**基本上都是穩定的,有數的幾個,所以在git config --global user.email 『[email protected]』 中全域性配置的是個人郵箱,在團隊的專案單獨配置郵箱)
配置流程
配置 git 使用者名稱、郵箱
git config --global user.name 『ciqing』 && git config --global user.email 『[email protected]』
git config --local user.name 『zhangguanjun』 && git config --local user.email 『[email protected]』
2.生成 ssh key 上傳到 github/gitlab
ssh key 預設生成後儲存在 ~/.ssh/目錄下 ,預設為 id_rsa 和 id_rsa.pub 兩個檔案,由於我們需要分開配置,所以這麼做:
ssh-keygen -t rsa -f ~/.ssh/id_rsa.gitlab -c "[email protected]"
ssh-keygen -t rsa -c "[email protected]"
命令執行完成後,這時~/.ssh目錄下會多出id_rsa.gitlab和id_rsa.gitlab.pub兩個檔案,id_rsa.gitlab.pub裡儲存的就是我們要使用的key,這個key就是用來上傳到 gitlab上的。
3.配置 config 檔案
在 ~/.ssh目錄下,如果不存在,則新建 touch ~/.ssh/config檔案 ,檔案內容新增如下:
host *intra.***.com
identityfile ~/.ssh/id_rsa.gitlab
user zhangguanjun
hi ciqing! you』ve successfully authenticated, but github does not provide shell access.
➜ ~ ssh -t [email protected]
welcome to gitlab, zhangguanjun!
看到這些welcome 資訊,說明就是 ok的了。
github和gitlab同時使用
由於公司團隊使用 gitlab 來託管 同時,個人在 github 上還有一些 倉庫,可公司郵箱與個人郵箱是不同的,由此產生的 ssh key 也是不同的,這就造成了衝突 如何在一台機器上面同時使用 github 與 gitlab 的服務?如果採用ssh協議或者git 協議通過終端命令對遠端倉庫進行...
同時使用 GitHub 和 GitLab
先說一下寫這篇部落格的緣由,之前自己開發專案的時候都是用 github 來託管 但是實習之後由於公司專案隱私問題,給分配了 gitlab 的使用者名稱和郵箱,當時我就直接在電腦上把使用者名稱和密碼進行了全域性配置,自那以後我在實習之餘做自己的專案時,每次往 github 上提交 都沒有我的 cont...
GitHub和gitlab同時使用
首先先本地申請秘鑰對,為了方便申請在同一目錄下。注意一路enter就行。ssh keygen t rsa c 1112346 qq.com f ssh gitlab id rsa ssh keygen t rsa c 1112346 qq.com f ssh github id rsa然後在各自的 ...