可以跨多个存储库设置git配置吗?


18

Git似乎支持三个级别的配置值:

  • 每个系统的全局设置(存储在中/etc/git-core
  • 每个用户的全局设置(存储在中~/.gitconfig
  • 每个存储库的本地设置(存储在中$REPO/.git/config

这些选项涵盖了大部分基础,但我正在寻找一种处理第四级的方法。我有(非常)大量的存储库,因此我需要为它们使用与user.email平时不同的值。这些存储库通常是通过自动脚本创建和操作的,每个存储库本地设置的设置很麻烦。

所有有问题的存储库都位于本地系统上的某个路径前缀下。有没有办法在某个位置设置配置值,该配置值将被该路径下的所有存储库继承?(类似.htaccess设置的排序沿文件系统一直继承。)也许会有一种方法可以在全局配置文件中设置条件值?在UNIX环境中还可以做哪些其他安排来应对像我这样的一组存储库?


我的第一反应是修改脚本,以对其.gitconfig创建的每个目录进行调整。例如,IIRC Android的存储可以执行此操作,但是您必须仔细阅读源代码才能找到答案。(我不太确定,我已经有一段时间没有这样做了。)
吉尔斯(Gills

@吉尔斯:那肯定是可能的。有问题的存储库是最近从CVS迁移到Git的Linux发行版的软件包存储库。我们仍在努力重做所有工具。从长远来看,这可能是固定的,但是从短期来看,我们从事此工作的人们正在尝试各种选择。
Caleb

Answers:


11

我没有找到在第四级配置git的方法。唯一的方法似乎是使用覆盖每个命令的配置值git -c key=value

我当前的hacky解决方案是定义一个外壳函数,用作git的包装。调用时,它将参数传递给系统git命令,但不会在检查当前工作目录并将该参数添加一个附加参数(如果适用)之前传递给系统git命令。

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

我该command git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"怎么办或应该怎么做?搜索高低,我发现对此-c标志的唯一参考是您的,谢谢,非常感谢。
Vic Goldfeld,

作为记录,我让它与command git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld



1

根据Caleb的回答,我们可以定义一个修改后的git命令,该命令将永久正确地永久配置此目录中的所有存储库,以便将来所有使用vanilla git的用户都将使用新配置。我使用hub,这是另一个git包装器,因此我将其替换alias git=hub为并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的答案不同,后者仅在外壳程序中起作用(除非明确提供,否则仅在交互式外壳程序中起作用),这也会影响其他git前端,这些前端会正确读取git配置,例如emacs magit。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.