分层git配置

mbzjlibv  于 2023-09-29  发布在  Git
关注(0)|答案(5)|浏览(96)

在我的个人机器上,我在全局git配置中设置了我的个人电子邮件地址。

$ git config --global --get user.email
[email protected]

但是,我也检查了我公司的代码,因此,我需要用我公司的电子邮件地址配置git。

$ cd corp/project
$ git config --local --get user.email
[email protected]

然而,有时候,当克隆一个repo时,我忘记覆盖我的电子邮件地址,所以我使用我的个人电子邮件地址提交。
可以删除我的全局git配置,从而防止我在本地git配置中设置user.email之前在任何repo中提交。
这有点像pita,在理想的情况下,我可以设置一个分层的git配置,以便某个子目录下的repos(或其他确定哪个配置适用的方法)使用其中最具体的设置。
类似于以下内容:

~/
|
+--- .gitconfig               # sets personal email address
|
+--- src/
     |
     +--- project/            # ~/.gitconfig email address applies 
     |    
     +--- corp/
          |
          +--- .git/config    # sets corp email address
          |
          +--- project/       # corp/.git/config email address applies

AFAIK目前这在git中是不可能的,它需要一个新的配置级别,位于全局和本地之间
有没有办法让我达到我在这里寻找的东西?

gtlvzcf8

gtlvzcf81#

由Orr Sella在git hooks上 checkout this great post,专门用于电子邮件使用。他完全放弃了全局配置,并使用钩子来防止没有可用配置的克隆:

EMAIL=$(git config user.email)
if [ -z "$EMAIL" ]; then
    # user.email is empty
    echo "ERROR: [pre-commit hook] Aborting commit because user.email is missing. Configure user.email for this repository by running: '$ git config user.email [email protected]'. Make sure not to configure globally and use the correct email."
    exit 1
else
    # user.email is not empty
    exit 0
fi

使用这个的方法是在邮件中。您可以改进此方法,在存储库根目录中查找本地配置,检查电子邮件(甚至使用grep),如果不存在,则使用全局配置。事

EMAIL = $(grep user.email $GIT_DIR/config)
if [[ $? ]]; then 
    EMAIL = $(git config user.email)
    exit 0
fi
EMAIL = $(EMAIL##*user.email* )

GIT_DIR在钩子运行时保证是仓库根目录。

shyt4zoc

shyt4zoc2#

AFAIK git本身只支持per-repo和全局身份。
我通过在zsh中使用cd钩子来归档类似的东西:

# ~/.zshrc
# call this function after cd-ing into a directory
__zsh-on-cd () {
if git ls-files &>/dev/null ; then
    if [[ "$PWD" =~ 'Company' ]]; then
        echo "setting git to use company identity"
        git config user.name "John Doe"
        git config user.email "[email protected]"
    else
        echo "setting git to use personal identity"
        git config user.name "johndoes"
        git config user.email "[email protected]"
    fi
fi
}

chpwd_functions=(${chpwd_functions[@]} "__zsh-on-cd")
icnyk63a

icnyk63a3#

你的假设是正确的,这是不原生支持由git的时刻。1(https://git-scm.com/book/tr/v2/Customizing-Git-Git-Configuration)
我认为最简单的解决方法是编写一个脚本来创建/克隆存储库。然后你可以设置一个(git)别名(例如git myinit| git myclone),询问您该项目是否为个人项目,并相应地设置电子邮件地址。

z8dt9xmd

z8dt9xmd4#

你可以使用git hooks:pre-commit检查你的本地配置并抛出错误。

# A git hook to make sure user.email and user.mail in repository  exists before committing

repository_email=$(git config --local --get user.email)
repository_name=$(git config --local --get user.name)

if [ -z "$repository_email" ] || [ -z "$repository_name" ]; then
    # user.email is empty
    echo "ERROR: [pre-commit hook] Aborting commit because user.email or user.name is missing. Configure them for this repository."
    exit 1
else  
    # user.email is not empty
    exit 0
fi
abithluo

abithluo5#

目前还不支持,但是从git 2.8(Mar '16)开始,你可以禁用全局用户配置,如下所示:

git config --global user.useConfigOnly true

这样git就永远不会让你提交,直到你在本地配置中设置一个电子邮件。你可以想一个脚本来获取你的全局设置,并复制到本地配置一个快速的解决方案。

相关问题