可以跨多個儲存庫設定 git 配置嗎?

可以跨多個儲存庫設定 git 配置嗎?

Git 似乎支援三個等級的配置值:

  • 每個系統的全域設定(儲存在/etc/git-core
  • 每用戶全域設定(儲存在~/.gitconfig
  • 每個儲存庫的本機設定(儲存在$REPO/.git/config

這些選項涵蓋了大部分基礎,但我正在尋找一種處理第四級的方法。我有一個(非常)大的儲存庫集合,我需要使用與user.email平常不同的值。這些儲存庫通常是透過自動化腳本建立和操作的,並且設定每個儲存庫的本機設定非常麻煩。

所有有問題的儲存庫都位於我的本機系統上的某個路徑前綴下。有沒有辦法在某個地方設定一個配置值,該值將被該路徑下的所有儲存庫繼承? (類似於.htaccess設定一直繼承到檔案系統。)也許有一種方法可以在全域設定檔中設定條件值?在 UNIX 環境中還可以進行哪些其他安排來處理像我這樣的一組儲存庫?

答案1

我沒有找到在第四級配置 git 的方法。唯一的方法似乎是使用 覆蓋每個命令的配置值git -c key=value

我目前的 hacky 解決方案是定義一個 shell 函數作為 git 的包裝器。呼叫時,它將參數傳遞到系統 git 命令,但在檢查當前工作目錄並向命令添加額外參數(如果適用)之前。

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c [email protected] "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

答案2

根據git配置查看這個解決方案:

https://dzone.com/articles/how-to-use-gitconfigs-includeif

新增到“~/.gitconfig”檔案:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

建立“~/.gitconfig-project1”文件,內容如下:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  
  
    [user]  
      name = user1  
      email = [email protected]  

答案3

您可以使用環境變數來設定 git 的電子郵件地址GIT_AUTHOR_EMAIL。如果你把它與進入目錄時執行 bash 腳本或者使用 zsh 進行目錄特定的 shell 配置您可以輕鬆更改每個目錄或父目錄的設置,例如,如果您進入目錄,~/work您可以自動調整環境變數來更改您的電子郵件地址。

答案4

根據 Caleb 的回答,我們可以定義一個修改後的git命令,該命令永久正確地配置此目錄中的所有儲存庫,以便以後所有使用 vanilla git 的都將使用新配置。我使用hub,這是另一個 git 包裝器,所以我alias git=hub用它替換了 my 並hub在我的函數中調用 - 如果您不使用hub,請將所有hub呼叫替換為command git

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

與 Caleb 的答案不同,答案僅在 shell 中運作(除非明確來源,否則僅在互動式 shell 中),這也會影響正確讀取 git 配置的其他 git 前端,例如 emacs magit。

相關內容