我们公司使用许多定制的开源项目。每当我提供上游分支时,我都会更改为使用我的个人电子邮件/名称。有没有办法让每个分支都有gitconfig?
例如我想要的是
[remote 'gerrit']
name = 'Personal Name'
[branch 'origin']
name = 'Name in company'
答案 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-commit
,prepare-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 07b2c0e的Denton 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
从master
到next
到pu
分支:三个不同的user.name
! 每个分支一个。
没有挂钩。没有脚本。
答案 4 :(得分:0)
仅供参考:请确保git
的版本正确。
这是我的问题,仅供参考:includeIf with branches in git
由于性能而发布