可以跨多个存储库设置 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。

相关内容