每个分支使用gitconfig

时间:2018-04-14 02:39:29

标签: git git-config

我们公司使用许多定制的开源项目。每当我提供上游分支时,我都会更改为使用我的个人电子邮件/名称。有没有办法让每个分支都有gitconfig?

例如我想要的是

[remote 'gerrit']
name = 'Personal Name'

[branch 'origin']
name = 'Name in company'

5 个答案:

答案 0 :(得分:4)

您可以使用post-checkout hook。运行

$ touch .git/hooks/post-checkout 
$ chmod a+x .git/hooks/post-checkout 

将内容添加到post-checkout脚本(根据需要编辑名称和分支)

#!/bin/bash
# $3 "0" - checking out file. "1" - checking out branch.
[[ "$3" == "0" ]] && exit 0 
branch=$(git status --short -b | cut -d' ' -f2-)
case $branch in
  gerrit*)
    git config user.name "Personal Name"
    echo "changed user.name to Personal Name"
    ;;
  master*)
    git config user.name "Company Name"
    echo "changed user.name to Company Name"
    ;;
  *)
    echo "Some other branch, what should user.name be?"
    ;;
esac

答案 1 :(得分:0)

我不知道在更改分支后会自动更改用户名和电子邮件的任何工具,但您可以在推送之前通过使用工具重写历史记录来设置该信息,例如filter-branch(并另外将其设置为预推送钩子来自动化过程)。您可以仅为特定分支设置更改作者信息。

查看以下链接了解详情: Changing author info

答案 2 :(得分:0)

Git config支持conditional includes,这将是一个不错的解决方案,但目前唯一支持的条件是存储库的路径。分支机构或遥控器不适合作为条件。当我们进行提交时,本地头部不必指向分支(分离的HEAD状态),并且本地分支不必具有跟踪分支。此外,本地分支的名称不必与其跟踪分支的名称相匹配。

我想到的第一个可能的解决方案是$somestring。提交完成后,在post-commit中获取正确的名称和电子邮件,然后运行post-commit以使用名称和电子邮件重写提交。经过几次尝试,我发现它会产生一个不定式的循环。提交会调用git -c user.name foo -c user.email bar commit --amend --no-edit来运行另一个post-commit

然后我尝试导出git commit之类的变量,与GIT_AUTHOR_NAME中作者和提交者的姓名和电子邮件相关。它也失败了。我认为这些值必须在pre-commit的最开始传递,而第一次调用的git commit已经太晚了,更不用说pre-commitprepare-commit-msg或{{1稍后调用的。

第三次尝试是commit-msg之类的别名,其中post-commit根据分支名称及其远程返回正确的git $(foo) commit。但涉及bash脚本的foo是一个泥坑,我只是放弃了。

最后我转回-c user.name=xx -c user.email=yy

git alias

它在某种程度上起作用。但是bug很明显。其中之一是,在post-commit提交作者是其他人之后,作者姓名和电子邮件将在#!/bin/bash head=`git rev-parse --abbrev-ref HEAD` remote=`git config --get branch."${head}".remote` if [ "$remote" = "origin" ];then git filter-branch -f --env-filter ' export GIT_AUTHOR_NAME=xx \ export GIT_AUTHOR_EMAIL=xx@foo.com \ export GIT_COMMITTER_NAME=xx \ export GIT_COMMITTER_EMAIL=xx@foo.com' \ HEAD^..HEAD elif [ "$remote" = "gerrit" ];then git filter-branch -f --env-filter ' export GIT_AUTHOR_NAME=yy \ export GIT_AUTHOR_EMAIL=yy@bar.com \ export GIT_COMMITTER_NAME=yy \ export GIT_COMMITTER_EMAIL=yy@bar.com' \ HEAD^..HEAD else echo no amend fi 完成后成为您的。此外,如第一段所述,如果你想让分支和遥控器成为这个钩子中的条件,那么你必须遵循一些严格的流程。没有分离的HEAD,配置中没有git cherry-pick

我认为理想的解决方案可能是别名或功能。这个answer也提供了一个很好的提示。为了平衡自动化水平和方便性以及稳健性,最好为两种情况设置两个别名,例如git filter-branch。您决定在不同分支上使用哪个别名。

答案 3 :(得分:0)

有了Git 2.23(2019年第三季度),无需结帐后挂钩,您可以正式使用git config conditional includes,而无需编写脚本!
条件包含机制学会了基于选择 HEAD当前所在的分支

请参见commit 07b2c0eDenton Liu (Denton-L)(2019年6月5日)。
(由Junio C Hamano -- gitster --commit 3707986中合并,2019年7月9日)

  

config:了解“ onbranch:includeIf条件

     

当前,如果用户希望每个分支都有单独的设置,则要求他们手动跟踪其头部中的设置,并手动在命令行上设置选项或更改每个分支上的配置。

     

教导配置“ onbranch:includeIf条件,以便可以   如果检查了分支,则有条件地包括配置文件   当前工作树中的输出匹配给定的模式。

git config man page现在包括:

  

onbranch

     

关键字onbranch:之后的数据被视为具有标准通配符和另外两个**//**的模式,可以匹配多个路径分量。

     

如果我们位于当前检出的分支名称与模式匹配的工作树中,则满足包含条件。

     

如果模式以/结尾,则会自动添加**
  例如,模式foo/变为foo/**

     

换句话说,它匹配以foo/开头的所有分支。如果您的分支机构是按层次结构组织的,并且您希望将配置应用于该层次结构中的所有分支机构,则这很有用。

所以在您的情况下:

[includeIf "onbranch:gerrit"]
  path=gerrit

.git/gerrit文件中:

[remote 'gerrit']
  name = 'Personal Name'

示例:

vonc@vonvb:~/gits/src/git$ git version
git version 2.23.0.b4


vonc@vonvb:~/gits/src/git$ git config includeIf.onbranch:next.path user1
vonc@vonvb:~/gits/src/git$ git config includeIf.onbranch:pu.path user2
vonc@vonvb:~/gits/src/git$ git config --local -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
...
includeif.onbranch:next.path=user1
includeif.onbranch:pu.path=user2

设置每个分支的配置文件:

vonc@vonvb:~/gits/src/git$ git config --file=.git/user1 user.name user1
vonc@vonvb:~/gits/src/git$ git config --file=.git/user1 user.email user1@email.com

vonc@vonvb:~/gits/src/git$ more .git/user1
[user]
    name = user1
    email = user1@email.com


vonc@vonvb:~/gits/src/git$ git config --file=.git/user2 user.name user2
vonc@vonvb:~/gits/src/git$ git config --file=.git/user2 user.email user2@email.com

vonc@vonvb:~/gits/src/git$ more .git/user2
[user]
    name = user2
    email = user2@email.com

检查它是否正常工作!

vonc@vonvb:~/gits/src/git$ git config user.name
VonC

vonc@vonvb:~/gits/src/git$ git checkout next
Branch 'next' set up to track remote branch 'next' from 'origin'.
Switched to a new branch 'next'
vonc@vonvb:~/gits/src/git$ git config user.name
user1

vonc@vonvb:~/gits/src/git$ git checkout pu
Branch 'pu' set up to track remote branch 'pu' from 'origin'.
Switched to a new branch 'pu'
vonc@vonvb:~/gits/src/git$ git config user.name
user2

vonc@vonvb:~/gits/src/git$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
vonc@vonvb:~/gits/src/git$ git config user.name
VonC

masternextpu分支:三个不同的user.name每个分支一个

没有挂钩。没有脚本。

答案 4 :(得分:0)

仅供参考:请确保git的版本正确。 这是我的问题,仅供参考:includeIf with branches in git

由于性能而发布