安裝完 Git 之後,可以使用 git config CLI 取得 Git 設定組態參數,git config 是一個記錄了 git 操作的所有基本檔案資料。 比方說 :

  • git init 創建時預設的 branch 名稱
  • 寫 git commit 的顯示模板
  • 當 push github 時的使用者資料

等等設定都可以在 git config 中調整修改。而在不同專案中,可能需要使用不同的 Git username 和 email, 例如個人專案中想使用「私人 Email」 ; 而在公司專案中則需要使用「公司 Email」,若每次切換專案時都要手動更改 Git 配置會十分麻煩。 這時 Git Include 可以根據資料夾自動套用對應的用戶設定,而無需每次手動調整。


Config CLI

git config CLI 取得 Git 組態參數被存放在:

  • /etc/gitconfig:整台電腦的所有用戶專案設定。 層級參數是 --system
  • ~/.gitconfig目前電腦用戶的所有專案共用設定。 層級參數是 --global (常用)
  • 任何 repository 中的 .git/config只有當前專案的設定 (常用)

當 config 設定衝突時,會以範圍小的優先( Local > Global > System )。 所以 .git/config 的設定優先權高於在 ~./gitconfig 裡的設定。

# 查詢目前所有設定值
git config --list
# 查詢特定項目的設定值
git config user.name

# 設定某值
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"

# 刪除某項設定
git config --global --unset user.name
# 打開 vim 編輯
git config --global --edit

在「一台電腦使用多個 Git 帳號」的情況時, Git Config 就會需要調整,本篇文章紀錄一下:

Git 多帳號管理

初次使用 GitHub 時,大家都會先以 SSH 方式連接到 GitHub,並綁定唯一的公鑰,前面也有文章說明了 SSH。 另外可能會遇到需要管理更多的 GitHub 帳號的情況,這時就會遇到一個問題:「要如何讓一臺電腦同時管理多個 GitHub 帳號呢?

includeIf

目前推薦的解決方案是使用 「includeIf」,它的邏輯是:「用資料夾分流」,這是 Git 官方後來支援的自動路由法。步驟如下:

創建專用資料夾

在電腦裡建立專用資料夾,例如:

  • ~/projects/personal/ (裡面的專案打算都用自己 github 帳戶
  • ~/projects/work/ (裡面的專案要用公司的 github 帳戶

例如說 ~/projects/work/ 要用特定 Git 用戶資訊,就在此資料夾中新建一個 .gitconfig 檔案。 在裡面加入 Git 用戶資訊,也就是在這個 folder 下想要用的 email 與 name

[user]
    name = company-name
    email = company@company.com

接下來要把資訊和 config 做關聯。

使用 includeIf

打開全域設定檔 ~/.gitconfig,改成:

# 全域預設用主要帳號(例如個人帳號)
[user]
    name = personal-name
    email = personal@email.com

# 如果專案路徑在 ~/projects/work/ 底下,自動載入另一份設定
[includeIf "gitdir:~/projects/work/"]
    path = ~/projects/work/.gitconfig

需要注意 .gitconfig 文件有後面配置覆蓋前面配置的特性。 所以要確保專用資料夾的設定生效,並且不被覆蓋,請將 includeIf 放在文件最後


上面是比較新的方法,以下也附上舊的做法,稱 「SSH Host 别名法」:

Step1. 先清除電腦裡「 Git 全域(Global)設定」裡面的 Git 使用者名稱與信箱
git config --global --unset user.name
git config --global --unset user.email

當 commit 時,Git 會自動附加上 name 和 email 訊息。

故若不把 「全域設定的使用者名稱與信箱」刪除,且在其他帳號要用的專案又忘記設定 local 身份時,Git 就會自動用這個全域的身份訊息去提交,導致 Commit 紀錄裡出現混亂的作者身份。 所以是建議要清除

Step2. 生成 SSH key,然後去 github 綁定並設定 ~/.ssh/config 內容

~/.ssh 內生成 SSH key ,命名管理好並配置上 Github ,再來編輯 ~/.ssh/config:

# default
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/<key-1>

# 第二個帳戶,要建立 github 別名
Host two.github.com
HostName github.com
User user1
IdentityFile ~/.ssh/<key-2>

# 第三個帳戶,要建立 github 別名
Host three.github.com
HostName github.com
User user2
IdentityFile ~/.ssh/<key-3>

如果 SSH Key 都有配上 github 了,可以測試 ssh 連結,例如:

ssh -T git@two.github.com
# Hi two! You've successfully authenticated, but GitHub does not provide shell access.
# 出現這個表示連接成功
Step3. 克隆專案要記得用別名

將專案 clone 到本地要特別注意,因為上一步配置了 ~/.ssh/config 檔,所以我們 clone 的時候要用別名,例如:

# 錯誤:(在網頁上看常規的 SSH Clone 名稱會需要改一下)
git clone git@github.com:XXXX #(不能使用這個)
# 正確:(用別名地址下載)
git clone git@two.github.com:XXXX
Step4. 綁項目對應 git 帳號

由於前面有把 global 身份取消了,現在要針對各個專案來設定身份訊息,所以去到新下載的專案內,設定 config:

git config user.name XXXX
git config user.email YYYY

includeIf 和 SSH Host 比較

includeIf 目前比較推薦,這樣做的話,只要專案是下載到指定的資料夾,那就:

  • 不需要去修改 .ssh/config 裡的 Host 網址
  • git clone 時可以完全照抄 GitHub 官方網址,直接下載
  • Git 在 Commit 時就會會自動指定身份訊息;不需要再針對專案做特別預設

參考資料