工作、開源兩不誤:Git多賬號管理

由於 Git 所具有的巨大優越性,越來越多的公司以及個人開始由 Svn 轉向 Git 。一般來講,每位員工都會被分配給一個公司內部的郵箱。比如一個 996 公司的員工 “張三”,獲得的可能就是一個 “[email protected]” 的郵箱。比較規範的公司,就會要求我們使用自己的名字和公司所分配給自己的這個郵箱來配置 Git(姓名和郵箱可以不用引號括起來):

git config --global user.name "張三"
git config --global user.email "[email protected]"

但是這種配置是全局的,如果我們之前剛好有在 GitHub 上維護項目,那這樣勢必就會將之前所做的 Git 賬戶配置給覆蓋了。那怎麼解決呢?我們總不能來回覆蓋,來回添加密鑰吧。我們能不能同時配置多個 Git 賬戶呢?

當然能。

這裏以 Mac 爲例,如果我們之前配置過全局的用戶名和郵箱,那麼在用戶目錄下的.gitconfig文件中(如/Users/zhangsan/.gitconfig),會有類似如下的配置:

[user]
    name = 張三
    email = [email protected]

當然,我們也可以直接使用命令來查看:

git config --global user.name
git config --global user.email

如果設置了這兩個全局屬性,就會輸出對應的值。若任何輸出的話,則表示未設置。

如果設置過,我們就需要將用戶名和郵箱這兩個全局變量進行重置。使用如下命令:

git config --global --unset user.name 
git config --global --unset user.email 

我們知道,一般 Git 服務器爲了安全,都會要求我們添加一個安全的 SSH 密鑰。但是默認情況下,生成的密鑰的文件名都是一樣的。因而,不同的用戶,必須設置不同文件名的密鑰文件,否則會發生覆蓋。所以,接下來千萬別覺得太熟悉不過了,就一路回車,千萬要悠着點手速。

以 “張三” 爲例,首先,我們需要根據公司郵箱來生成密鑰對:

ssh-keygen -t rsa -C "[email protected]"

回車後會出現下面這句話:

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/zhangsan/.ssh/id_rsa):

這時候可千萬別一路回車,注意看提示,這裏要我們輸入要保存的私鑰的路徑和文件名,爲了以後易找,我們就仍然放在該路徑下,只不過更改個跟平臺相關的文件名,輸入:

Users/zhangsan/.ssh/996icu_id_rsa

接着就可以一路回車了,默認密碼爲空即可。

生成完密鑰之後,我們還需要使用ssh-add命令是把專用密鑰添加到ssh-agent的高速緩存中。該命令位置在/usr/bin/ssh-add,用法如下:

ssh-add -K ~/.ssh/996icu_id_rsa

之後我們需要將生成的密鑰對中的公鑰裏的內容用文本編輯器打開,複製下來,添加到對應的平臺上面,比如公司的 GitLab 或者 GitHub 等。

Mac 下面可以直接使用如下命令來把公鑰複製到剪切板:

pbcopy < ~/.ssh/996icu_id_rsa.pub

同樣地,我們使用 “[email protected]” 這個郵箱,來生成供 GitHub 使用的賬戶的私鑰github_id_rsa和公鑰github_id_rsa.pub,並把公鑰添加到 GitHub 平臺上。

接下來我們還需要修改 Git 的本地配置,來將遠程的服務器地址和本地的私鑰文件進行關聯。這樣通過比較私鑰和之前填在該平臺上的公鑰,就能進行權限驗證。

Users/用戶名/.ssh/目錄下面新建一個名爲config的配置文件,添加如下內容:

# github email address
Host github
HostName github.com 
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa

# gitlab email address
# 公司內網地址
HostName 192.168.6.106 
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/996icu_id_rsa

這裏就將遠程地址和本地的私鑰文件對應了起來。

配置文件中的 HostName 是遠程倉庫的訪問地址,這裏可以是 IP,也可以是域名。Host 是用來拉取的倉庫的別名,配不配置都行。如果 HostName 沒配置的話,那就必須把 Host 配置爲倉庫 IP 地址或者域名,而非別名。

配置了這些之後,我們就能夠成功的從遠程拉取倉庫了,拉取之後,cd到倉庫目錄下,配置該倉庫使用的用戶名和郵箱:

git config --local  user.name 張三
git config --local user.email [email protected]

當然,你也可以直接不用 --local參數

注意,這裏的賬戶可以和我們開始時生成祕鑰的郵箱不同。那個郵箱其實配置的是我們電腦針對某個 IP 的 “全局” 賬戶(注意,不是global參數指定的那個全局),這裏配置的是某個倉庫下的 “局部” 用戶,當然,你把這個倉庫再 copy 一份的話,就可以設置個其他的用戶名和郵箱了,畢竟是局部的嘛,相當於多個用戶在同一臺電腦上進行工作。

還有,如果你未指用戶名和郵箱的話,Git 會自動使用電腦登錄的用戶名,比如“zhangsan”,郵箱默認就是 “[email protected]”,這當然不是我們想要的,所以最好配置下吧。

到這裏,還沒完。如果你使用的是 IDEA,比如 AS,還需要設置 SSH 使用本地(native)的客戶端,而非 AS 內嵌(build in)的 SSH 客戶端 :

在AS 3.5 Canary 10 版本上,發現沒有這個選項,應該是默認使用了本地的 SSH 客戶端。

到這裏仍然沒有完,對於 Mac,可能會遇到升級系統或者重啓系統之後,SSH私鑰失效的問題,這時候我們可以通過在~/.ssh/config文件中添加如下內容來解決:

Host *
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/github_id_rsa
   IdentityFile ~/.ssh/996icu_id_rsa

如果還不生效,那就可以通過自己編寫 shell 腳本
(這裏我使用的是 zsh,所以配置的是#! /bin/zsh,若使用的是系統自帶的終端,可以修改爲#! /bin/bash):

vim .ssh/ssh_add_private_keys.sh
#! /bin/zsh
# 添加 github 公鑰
ssh-add ~/.ssh/github_id_rsa
# 添加 公司 gitlab 公鑰
ssh-add ~/.ssh/996icu_id_rsa

// 賦予sh文件可運行權限
chmod +x .ssh/ssh_add_private_keys.sh

然後把它添加到開機啓動項中:系統偏好設置>用戶與羣組>登錄項

當然,我們也可以創建一個Automator任務,並將其添加到系統開機啓動項中。

然後創建一個 App 應用程序:

添加 shell 腳本代碼:

然後按Command+S保存,文件名另存爲ssh_add_private_keys.app

然後把剛纔添加的這個APP添加到開機啓動項中:

當然,上面這兩種添加方式本質上都是一樣的,只不過一個是創建的.sh的 shell 腳本文件,而一個是運行 shell 腳本的 App 文件形式。

歡迎關注公衆號來獲取其他最新消息,有趣的靈魂在等你。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章