如何使用不同的 Git Commit 設定

最近在開發自己的個人專案時,上 commit 都會使用到公司的名稱與公司的 Email。

(後續會補齊如何修改原先已經 commit 的 Author Name 及 Email)

因此希望可以做到自己的 Git Repo 會使用自己的 Name 與 Email。

在公司的 Repo 就一樣持續使用公司的設定。

之前其實設定過了好幾次,只是每次換電腦再使用的時候都還是會上網查資料,因此希望可以寫成 Blog。 加深印象。

0. 單一 Commit 修改 Author

如果今天你準備要提交的 Commit 希望 Author 可以使用別的名字可以使用下方的程式碼

注意:在 –author 中 name 是必填,而 email 則是選填因此可以使用 <> 來表示不設定 email。

--author "your name <your email>"

git commit --author "Your Name <email>" -m "Commit message" 
git commit --author "Your Name <>" -m "Commit message" // 不填 Email

方法1. 最簡單的方式

直接上作法

原理:在專案底下的 .git/config 新增 Author 的 Name 及 Email。

系統會先去看專案底下的 config 是否有相關的設定,沒有才會去看 Git Global Config 設定 (也就是 ~/.gitconfig 這個檔案)。

直接在專案底下執行下面程式碼

cd {your repo path}  // 去到專案底下

git config user.name "{your name}"
// git config --local user.name "{your name}"  
// 效果一樣

git config user.email "{your email}"
// git config --local user.email "{your email}"
// 效果一樣

缺點

這個方式有個缺點,就是每一次開新的 Repo 或是 git clone 新的 Repo 都要先設定一次。

具體細節

原先尚未設定的情況

進到專案底下執行 cat .git/config,可以看到這個 Repo 中 Git的基礎設定,設定顯示如下

[core]
	bare = false
	repositoryformatversion = 0
	filemode = true
	ignorecase = true
	precomposeunicode = true
	logallrefupdates = true
[remote "origin"]
	url = https://github.com/{your github name}/{repo name}.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main

可以注意到其實沒有 user 的設定,因此在後續進行 commit 時就會帶上 Git Global User 的資訊。

(也導致會帶上公司的設定)

關於 Git Global Config 的基礎設定可以參考下方的 Reference 1,這邊就不贅述。

設定完成後

一旦執行了上述指令後,就會將 name 及 email 寫入 local repo 的 git config 裡面。

如何確認?

再一次執行 cat .git/config,可以發現原本 config 下方多了 name 及 email

略...
[branch "main"]
	remote = origin
	merge = refs/heads/main
[user]
	name = {your name}
	email = {your email}

也可以使用 git config user.name and git config user.email獲取目前的設定值為何。

這樣即可做到,在這個 repo 底下的 commit 都會使用個人的 name 與 email。

PS. 後續更改其實也可以直接使用 IDE 打開 yourRepo/.git/config 來進行修改。

方法2. 根據資料夾做設定(推薦)

上述的方法1直覺與快速,但是缺點也很明顯,也就是在另外一個 Repo 環境就又要再做一次了~

因此我希望可以達到在個人資料夾底下的專案都可以使用個人的設定。

在公司這個資料夾底下的所以專案都使用公司的設定。

所幸 git 有提供 Conditional includes2 的功能,可以根據檔案路徑來決定使用何種設定。

目前檔案結構如下

➜  Repository tree
.
├── Company
│   └── CompanyRepo1
└── Personal
    └── SomeRepo

I. 根據公司及個人製作不一樣的 Git Config 檔案

由於我目前 ~/.gitconfig 的全域設定是使用公司的,因此其實只要再針對個人的做設定就好。

不過為了演示說明,我這邊會分別製作公司、個人分別所使用的 gitconfig。

檔名分別為 .company-gitconfig .personal-gitconfig

// Company/.company-gitconfig
[user]
	name =  Company User Name
	email = Company User @email.com
// Personal/.personal-gitconfig
[user]
	name =  Personal User Name
	email = Personal User @email.com

並將檔案分別放置在 Company 、 Personal 資料夾底下

II. 在全域的 Git Config 進行設定

打開 ~/.gitconfig 在 user 底下,新增下面的 includeIf 語法與相對應 config 的 path。

// ~/.gitconfig
略....

[user]
	name = Global Git User Name
	email = Global Git User Email
	[includeIf "gitdir:~/Repository/Company/"]
    	path = ~/Repository/Company/.company-gitconfig
	[includeIf "gitdir:~/Repository/Personal/"]
    	path = ~/Repository/Personal/.personal-gitconfig
    	
略....

[includeIf "gitdir: {your path} "]:判斷路徑是否符合

path = {your specific git config file path}:使用指定路徑的 git config

III 結論

因此只要在 Personal 資料夾底下的專案都會使用個人的 Name 及 Email 設定。

這個方法只要做一次就一勞永逸,只要 git clone 或是新的 Repo 有在相對應的資料夾底下就可以取得相對應的設定。

所以我個人比較推薦使用這個方式。

最後的檔案結構如下

.   Repository
├── Company
│   ├── .company-gitconfig
│   ├── CompanyRepo1
│   ├── 後續 Repo ...
│
└── Personal
    ├── .personal-gitconfig
    ├── PersonalRepo
    ├── 後續 Repo ...
    

如果有需要根據不同資料夾或是檔名路徑做其他特別設定的話,可以參考 2

這邊這樣的方式就已經滿足我的需求。

Reference

開始 - 初次設定 Git


  1. 為你自己學 Git - 使用者設定 ↩︎

  2. Conditional includes ↩︎