每个分支使用gitconfig

XeI*_*Ite 4 git git-config

我们公司使用许多定制的开源项目。每当我向上游分支机构捐款时,我都会更改为使用我的个人电子邮件地址/名称。有什么办法让每个分支都有gitconfig吗?

例如我想要的是

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

[branch 'origin']
name = 'Name in company'
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 6

使用 Git 2.23(2019 年第三季度),无需 post-checkout 钩子,您可以使用正式的git config条件包含,无需脚本!
条件包含机制学会了根据 HEAD 当前所在的分支进行选择

请参阅Denton Liu ( ) 的commit 07b2c0e (05 Jun 2019 )(由Junio C Hamano合并-- --提交 3707986 中,2019 年 7 月 9 日)Denton-L
gitster

config: 学习 " onbranch:"includeIf条件

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

教配置“ onbranch:includeIf条件,以便它可以有条件地包含配置文件,如果在当前工作树中检出的分支与给定的模式匹配。

git config手册页现在包括:

onbranch

关键字onbranch:后面的数据被视为具有标准通配符和两个附加通配符的模式,**/并且/**可以匹配多个路径组件。

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

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

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

所以在你的情况下:

[includeIf "onbranch:gerrit"]
  path=gerrit
Run Code Online (Sandbox Code Playgroud)

并在.git/gerrit文件中:

[remote 'gerrit']
  name = 'Personal Name'
Run Code Online (Sandbox Code Playgroud)

例子:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

检查它是否正常工作!

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
Run Code Online (Sandbox Code Playgroud)

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

没有钩子。没有剧本。


如 Git 2.30(2021 年第一季度)所示,请确保使用 Git 2.24+,否则您可能会收到一些奇怪的错误消息:

请参阅Johannes Schindelin ( ) 的commit f1beaae (2020 年 11 月 19 日)(由Junio C Hamano合并-- --commit 1242501,2020 年 11 月 30 日)dscho
gitster

t1309: 在onbranch测试用例中使用中性分支名称

签字人:约翰内斯·辛德林

onbranch此补丁涉及的测试用例实际上并未尝试包含任何其他配置。他们的目的是避免回归include.onbranch:<name>.path我们过去修复的代码中的两个错误,这些错误实际上与任何具体的分支名称无关。

第一个错误已在85fe0e800ca修复(“ config:使用 includeif:onbranch 和早期配置解决错误”,2019 年 7 月 31 日,Git v2.23.0-rc1 -- merge)。
本质上,在读取早期配置时,会有一个 catch-22 试图访问 refs,因此我们根本无法在那时评估条件。测试用例确保我们避免发出这种虚假消息:

BUG: refs.c:1851: attempting to get main_ref_store outside of repository  
Run Code Online (Sandbox Code Playgroud)

第二个测试用例涉及非 Git 场景,其中我们根本没有当前分支开始(因为我们首先没有存储库),并且测试用例是在22932d9169f (" config: stop检查是否the_repositoryNULL", 2019-08-06, Git v2.24.0-rc0 --合并第 2 批中列出) 以确保如果代码仍然错误地尝试查看任何引用,我们不会导致分段错误。

简而言之,即使在回归的情况下,这两个测试用例都不会查看当前的分支名称。因此,实际的分支名称根本无关紧要。因此,我们可以轻松地在此处避免带有种族色彩的分支名称,这就是此补丁所做的。


Mot*_*ets 5

您可以为此使用结帐后挂钩。跑

$ touch .git/hooks/post-checkout 
$ chmod a+x .git/hooks/post-checkout 
Run Code Online (Sandbox Code Playgroud)

将内容添加到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
Run Code Online (Sandbox Code Playgroud)