使用--no-ff合并时Git无法读取作者相关环境变量的问题
问题原因与解决方案
问题根源
当你执行git merge --no-ff却不通过-m参数指定提交消息时,Git会启动编辑器让你编辑合并提交的内容。此时commit-msg钩子运行时,Git不会将GIT_AUTHOR_NAME、GIT_COMMITTER_NAME这类作者相关的环境变量传入钩子进程,导致你在钩子中读取不到这些值。
这是因为这种合并场景下,Git默认直接使用当前本地Git配置里的user.name和user.email作为提交的作者/提交者信息,但不会通过环境变量把这些值传递给钩子,而是在最终创建提交时直接调用配置值。
解决办法
1. 从Git配置直接获取作者信息(推荐)
放弃依赖GIT_AUTHOR_NAME等环境变量,在commit-msg钩子脚本里用Git命令直接读取本地配置的用户信息:
# 获取当前用户的作者名和邮箱 AUTHOR_NAME=$(git config user.name) AUTHOR_EMAIL=$(git config user.email) COMMITTER_NAME=$(git config user.name) COMMITTER_EMAIL=$(git config user.email)
这种方式不管是普通提交还是合并提交,都能稳定获取到执行当前Git操作的用户信息,适配所有场景。
2. 合并时直接指定提交消息
如果不需要手动编辑合并消息,可以在合并时用-m参数直接指定内容:
git merge --no-ff -m "合并release/1.2.0分支到master" release/1.2.0
这种场景下Git不需要启动编辑器,commit-msg钩子运行的上下文和普通提交一致,会正常传入GIT_AUTHOR_NAME等环境变量。
3. 针对release分支作者的特殊处理(如果需要)
如果你的白名单逻辑是针对release分支上的提交作者(而非执行合并操作的用户),可以通过命令获取release分支的最后提交作者:
# 获取release/1.2.0分支最后一次提交的作者名 RELEASE_AUTHOR=$(git log -1 release/1.2.0 --pretty=format:"%an")
再基于这个值做白名单校验即可。
内容的提问来源于stack exchange,提问作者Norayr Ghukasyan
相关产品推荐
相关产品推荐

