分层git配置

时间:2017-05-01 04:38:58

标签: git

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

$ git config --global --get user.email
steve@personal.com

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

$ cd corp/project
$ git config --local --get user.email
steve@corp.com

然而,有时候,当克隆回购时我忘记覆盖我的电子邮件地址,所以我使用我的个人电子邮件地址。

有可能删除我的全局git配置,从而阻止我在本地git配置中设置user.email之前提交任何仓库。

虽然这是一个皮塔饼,但在一个理想的世界中我可以设置一个分层的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本身不可能,它需要一个位于全局和本地之间的新级别的配置

我有办法实现我在这里寻找的目标吗?

5 个答案:

答案 0 :(得分:6)

目前尚不支持,但是从git 2.8(2016年3月)开始,您可以按如下方式禁用全局用户配置:

git config --global user.useConfigOnly true

这样,在您在本地配置中设置电子邮件之前,git永远不会让您提交。您可以考虑使用脚本来获取全局设置并复制到本地配置以获得快速解决方案。

答案 1 :(得分:2)

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

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 name@example.com'. 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 保证是存储库根目录。

答案 2 :(得分:1)

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 "doe@company.com"
    else
        echo "setting git to use personal identity"
        git config user.name "johndoes"
        git config user.email "me@personal.domain"
    fi
fi
}

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

答案 3 :(得分:0)

你认为git目前本身不支持是正确的。 [1]

我认为最简单的解决方法是编写用于创建/克隆存储库的脚本。然后,您可以设置(git)别名(例如SELECT jobs.*, bids.* FROM jobs LEFT JOIN bids ON jobs.jobID = bids.jobID | git myinit),询问您项目是否属于个人,以及相应地设置电子邮件地址。

答案 4 :(得分:0)

您可以使用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