确保 github PR squash 合并提交评论包含问题 ID

Ensure github PR squash merge commit comments contain issue ID

如何确保来自 github PR 压缩合并的提交评论包含所需的文本?

我们使用 Jira + Github,如果用户在提交评论中输入 Jira 问题 ID,那么这些提交就会链接到 Jira 问题。

当用户从他们的私有功能分支合并 PR 时,他们通常会压缩和合并,这意味着用户可以手动总结从该分支到更大的集成分支或主分支的单个提交的意图。

如果用户在合并 PR 时忘记输入它们,编辑提交并将文本添加到消息中会变得很痛苦。

我可以在 PR 上使用状态检查或提交消息格式化程序来确保必须有看起来像 Jira ID 的东西吗? (AAA-111)

如果您使用的是 GitHub Enterprise,您可以设置 pre-receive hook 来拒绝其中没有 JIRA 票证编号的提交。

Check out the example here:

#!/bin/bash
#
# check commit messages for JIRA issue numbers formatted as [JIRA-<issue number>]

REGEX="\[JIRA\-[0-9]*\]"

ERROR_MSG="[POLICY] The commit doesn't reference a JIRA issue"

while read OLDREV NEWREV REFNAME ; do
  for COMMIT in `git rev-list $OLDREV..$NEWREV`;
  do
    MESSAGE=`git cat-file commit $COMMIT | sed '1,/^$/d'`
    if ! echo $MESSAGE | grep -iqE "$REGEX"; then
      echo "$ERROR_MSG: $MESSAGE" >&2
      exit 1
    fi
  done
done
exit 0

解决此问题的另一种方法*是确保提交消息包含分支名称,这在 JIRA 中很可能源自问题标题。

为此,同事必须在他们的 .git/hooks 目录中包含一个名为 commit-msg 的文件,其内容如下:

#!/bin/bash
current_branch="$(git rev-parse --abbrev-ref HEAD)"
tmp=$(mktemp) || exit
echo "$current_branch $(cat "")" > "$tmp"
mv "$tmp" ""

然后当有人在功能分支 ABC-1234-customers-cant-log-in 上提交时,像这样的提交命令:

git commit -m "Awesome changes"

...实际上会产生以下提交消息:

ABC-1234-customers-cant-log-in Awesome changes

...然后 JIRA 将自动检测它并 link 提交问题,从而确保在 JIRA 问题页面上可靠地回顾提交。

我们已经在我的团队中实施了这项政策,它有几个优点:

  • 不再忘记提交消息中的 JIRA 问题编号
  • 赢得时间
  • 在需要时更容易解析提交消息

(作为旁注,以防万一,此自动行为也可以根据需要停用,git commit -n

* (请注意,这两个解决方案并不相互排斥。事实上,您很可能需要两者,Adil's 用于远程回购完整性,而这个用于本地使用效率)