做為一名軟體工程師,在個人跟公司之間的 Git 身份切換是一種常見的情況,特別下心思去管理 Git 的身份有很多好處:一是對自己進行角色定位,從而以更好的心態面對工作;另一是透過區隔出工作與個人專案,讓自己顯的更專業。
本文將介紹如何透過 gitconfig 的設定以及資料夾的組織方式,輕鬆地在不同 Git 身份之間切換。我們會首先提供思路和實際操作方法,使你在未來需要時能快速地查找本文,文章後會再簡單介紹 gitconfig 的設定機制,讓你能多知道一些背後的思考邏輯。
TLDR
透過 gitconfig 中的 include 機制,要求 Git 在不同根目錄之下時,自動 include 不同的 gitconfig,藉此決定你進行 git commit
時候的身份。
Git Setup Walkthrough
情境 (請自行帶入)
- 屬於我的個人的開發專案,聯繫的 email 會是 ianchen@example.com 。
- 屬於我的公司
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 中命名的資料夾名稱,範例如下:
這步驟完成後,基本上也算是設定完成自己的 gitconfig,我們接下來會進一步去處理特定資料夾下的覆寫檔案。
Step 3. 設定公司的專案資料夾
- 根據 Step1 中取的名字,在家目錄下建立對應的資料夾:
~/evil-inc
。 - 編輯(新增)
~/evil-inc/.gitconfig
檔案,確保有以下內容:
在這步驟後,當 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/**"]
,
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/
路徑資料夾尚未建立完成。
以上就是本篇文章的全部內容,如果有任何的想法或改進建議,請直接聯絡我,謝謝。
下篇文章見!