Windows版Sourcetree如何配置自动在提交信息前添加Jira工单ID
Windows 版 Sourcetree 实现提交自动预填 Jira ID 方案
你之前配置的prepare-commit-msg钩子不生效,不是Sourcetree不支持钩子,是Windows环境下有几个容易踩的静默失败坑,按下面的步骤配置可以完全实现你要的效果:打开提交对话框时输入框自动预填当前分支对应的Jira ID,格式为HAD-4234: 。
钩子失效的常见原因
先排查你之前配置失败的问题,基本逃不过这三点:
- Sourcetree默认使用自带的内嵌Git,你脚本开头写死的sh.exe路径和内嵌Git的路径不匹配,钩子直接无法启动,且没有报错提示
- Windows下编辑的shell脚本默认用CRLF换行符,sh解释器解析shebang行时会把回车符当成路径的一部分,直接找不到解释器
- 钩子文件带了
.sh后缀,或者没有加可执行权限,Git会直接跳过不执行
分步配置指南
1. 统一Sourcetree调用的Git版本
打开Sourcetree,依次进入「工具」→「选项」→「Git」标签页,找到Git版本设置项,选择「系统Git」,选中你本机单独安装的Git程序路径(默认路径为C:\Program Files\Git\bin\git.exe),不要使用Sourcetree内嵌的Git版本,避免多环境路径不一致的问题。
2. 替换prepare-commit-msg钩子脚本
进入对应项目的.git/hooks目录,删除之前创建的无效钩子文件,新建一个无任何后缀名的文件,文件名必须为prepare-commit-msg,写入以下内容:
#!/bin/sh # 从当前分支名提取Jira ID自动预填到提交信息开头 BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) # 跳过分离头指针、rebase场景,支持设置SKIP_PREPARE_COMMIT_MSG=1临时关闭钩子 if [ -z "$BRANCH_NAME" ] || [ "$BRANCH_NAME" = "HEAD" ] || [ "$SKIP_PREPARE_COMMIT_MSG" = "1" ]; then exit 0 fi # 匹配Jira ID规则:2-5位大写字母+横杠+1-4位数字 JIRA_PATTERN='[A-Z]{2,5}-[0-9]{1,4}' echo "$BRANCH_NAME" | grep -Eq "$JIRA_PATTERN" if [ $? -ne 0 ]; then exit 0 fi JIRA_ID=$(echo "$BRANCH_NAME" | grep -Eo "$JIRA_PATTERN" | head -1) # 检查提交信息是否已包含当前Jira ID,避免重复添加 grep -Eq "^$JIRA_ID:" "$1" if [ $? -eq 0 ]; then exit 0 fi # 插入ID到提交信息第一行,格式为 JIRAID: sed -i.bak "1s/^/$JIRA_ID: /" "$1" # 删除Windows下sed生成的临时备份文件 rm -f "$1.bak"
3. 修复Windows环境专属的脚本问题
这两步漏了大概率还是不生效:
- 保存脚本时,必须使用LF换行符,不能用Windows默认的CRLF。用VS Code等编辑器编辑时,点右下角的换行符标识切换为LF即可。
- 打开Git Bash,进入项目的
.git/hooks目录,执行chmod +x prepare-commit-msg给脚本添加可执行权限。Windows环境下Git依然会校验这个权限位。
效果和团队推广说明
- 配置完成后无需重启Sourcetree,点击提交按钮打开对话框时,输入框会自动带上当前分支提取到的Jira ID前缀,直接在后面写提交内容即可。
- 团队批量推广时,可以把这个钩子放到团队共享的配置仓库,通过Git的
core.hooksPath参数配置全局钩子目录,不需要每个开发手动给每个项目加钩子文件。 - 你之前了解到的「Windows版Sourcetree不支持提交模板」是非常老版本的问题,当前新版本已经支持,但钩子方案比静态模板灵活很多——ID是动态从当前分支名提取的,切换分支后自动对应,不需要手动修改模板内容。
内容的提问来源于stack exchange,提问作者Kira Resari
相关产品推荐
相关产品推荐

