IanChenAboutPosts

Gitconfig 實用指南:輕鬆切換並管理你的 Git 身份

avatar奕安Aug 3, 2023

做為一名軟體工程師,在個人跟公司之間的 Git 身份切換是一種常見的情況,特別下心思去管理 Git 的身份有很多好處:一是對自己進行角色定位,從而以更好的心態面對工作;另一是透過區隔出工作與個人專案,讓自己顯的更專業。

本文將介紹如何透過 gitconfig 的設定以及資料夾的組織方式,輕鬆地在不同 Git 身份之間切換。我們會首先提供思路和實際操作方法,使你在未來需要時能快速地查找本文,文章後會再簡單介紹 gitconfig 的設定機制,讓你能多知道一些背後的思考邏輯。

TLDR

透過 gitconfig 中的 include 機制,要求 Git 在不同根目錄之下時,自動 include 不同的 gitconfig,藉此決定你進行 git commit 時候的身份。

Git Setup Walkthrough

情境 (請自行帶入)

  1. 屬於我的個人的開發專案,聯繫的 email 會是 ianchen@example.com
  2. 屬於我的公司 evil inc. 的專案,且我在這間公司的 email 是 ianchen@evil.inc

Step 1. 思考公司的專案資料夾名稱

替你的公司取一個專門的資料夾名稱,盡量是一個沒有空格的單字,如果真的需要可以用 "-" 取代空格,e.g. evil or evil-inc,在這裡以 evil-inc 為例。

Step 2. 設定家目錄下的 gitconfig

編輯 ~/.gitconfig 檔案,這是在你電腦上任何資料夾操作 Git 時候會採用的預設設定。首先確定 user 區塊,是你平常想使用的個人相關資訊。

再來是加入(修改)一個 includeIf 區塊,這裡會引入給公司專用的 .gitconfig,並在特定情況下覆寫掉原始設定。

請將 evil-inc 抽換成 Step1 中命名的資料夾名稱,範例如下:

# filepath: ~/.gitconfig
[user]
    name = "Ian Chen (alive)"
    email = "ianchen@example.com"

[includeIf "gitdir:~/evil-inc/**"]
    path = ~/evil-inc/.gitconfig

這步驟完成後,基本上也算是設定完成自己的 gitconfig,我們接下來會進一步去處理特定資料夾下的覆寫檔案。

Step 3. 設定公司的專案資料夾

  • 根據 Step1 中取的名字,在家目錄下建立對應的資料夾:~/evil-inc
  • 編輯(新增) ~/evil-inc/.gitconfig 檔案,確保有以下內容:
# filepath: ~/evil-inc/.gitconfig
[user]
	name = "Ian Chen (half dead)"
	email = "ianchen@evil.inc"

在這步驟後,當 cwd 處於 ~/evil-inc 下的任何 Git 專案中,Git 都會根據這份 gitconfig (~/evil-inc/.gitconfig) 的內容來覆寫掉系統預設的資訊。

在此之後,你只需要確保公司用的 Git 專案都是 clone 到 ~/evil-inc 之下就可以了。

解釋: Git 的設定解析機制與 includeIf 用法

對於 Git 來說,我們的設定 (gitconfig) 有三種不同的層級:系統使用者 以及 專案 ,三個不同層級的主要差異是檔案的存放位址。當執行 Git 操作時,Git 會按照順序解析不同層級的設定檔案,並在兩個文件中指定了相同設定值的情況下,優先選擇後出現的設定。

本文章操作的 .gitconfig 屬於 使用者層級 的設定(這些設定位於我們的家目錄下),主要方法是透過以 includeIf 為基礎的 conditional include 進行操作。

includeIf 語法提供了不錯的彈性,允許我們使用特殊關鍵字來進一步描述使用情境。 例如,在本篇文章中,我們使用了 gitdir: 這個關鍵字告訴 Git 當操作時的 cwd 在特定情況下,需要進一步套用其他的 gitconfig 設定,藉此達到針對公司專案進行特別處理的效果。

讓我們看一下 ~/.gitconfig 中所用到的語法:

[includeIf "gitdir:~/evil-inc/**"]
    path = ~/evil-inc/.gitconfig

首先可以關注 [includeIf "gitdir:~/evil-inc/**"]gitdir 屬於 includeIf 其中支援的一種變數,你也可以透過其他變數指定如 當前 branch, remoteUrl 等等的特定情況。

在這段設定中 ~/evil-inc/** 在路徑上代表 ~/evil-inc 跟所有子資料夾。 由於 Git 文件中有明確說到路徑的指定方式與 gitignore 相同 ,所以如果想要寫的更簡潔一些,可以直接忽略 **,只需要使用 [includeIf "gitdir:~/evil-inc/"] 就可以了。只不過,這篇文章為了避免讀者抄寫時漏掉最後的斜線(/),所以才選擇了使用 /** 來減少錯誤發生。

再來看一下程式碼中的 path = ~/evil-inc/.gitconfig, 這表示你要引用的 gitignore 實際檔案位址。 在 gitconfig 中使用 includeIf 這樣的 conditional include 而不是單純的 include 可以避免 git 載入失敗的問題,因為可能我們需要的 ~/evil-inc/ 路徑資料夾尚未建立完成。

以上就是本篇文章的全部內容,如果有任何的想法或改進建議,請直接聯絡我,謝謝。

下篇文章見!

References: