在SourceTree中为提交消息添加前缀

8
我通常会从JIRA问题页面创建分支。比如说,我的JIRA票号为“SOMEBUG-356:软件中的错误”,那么分支名称将是:“feature/SOMEBUG-356-bug-in-software”。
是否有可能在SourceTree上设置一种模板,在我当前所在的分支的JIRA票号前面添加一个前缀作为提交消息? (如果我在“feature/SOMEBUG-356-bug-in-software”分支上,它将添加SOMEBUG-356前缀)
2个回答

4

我不确定这是否是正确的方式,在我们公司创建分支等操作时,我们使用本地的gitflow。然而,在所有提交中,我们都强制使用正则表达式作为提交的一部分。你可以通过进入项目的.git文件夹并打开hooks文件夹来实现这一点,在那里你会看到一个commit-msg.sample文件,将其删除后改名为commit-msg。在此文件中添加类似以下内容的代码:

#!/usr/bin/env bash


# regex to validate in commit msg
commit_regex='(SOMEBUG|SOMEOTHERBUG)-[0-9]{0,6}\w+'
error_msg="Aborting commit. Your commit message is missing a valid JIRA Issue key and number. An example commit would be SOMEBUG-1234"

if ! grep -iqE "$commit_regex" "$1"; then
    echo "$error_msg" >&2
    exit 1
fi

这个功能可以在每次提交时强制使用正则表达式,因为它位于您的项目.git文件夹中,所以您可以针对每个项目设置自定义挂钩。 然后将原点添加到jira中,jira会将您的提交同步到jira票证。 如果您再使用FishEye + Crucible,它就可以成为一个非常强大的关系。

你的解决方案是验证消息,而不是设置模板,所以不是正确答案。你可以使用git hooks来为git生命周期添加验证、行为等。对于每种类型的hook,你会在同一文件夹中找到一些示例。存在一个名为prepare-commit-msg.sample的样例。 - voiski
我同意这不是正确的答案,它强制在提交时进行正则表达式检查。答案可在此处找到:https://dev59.com/i2025IYBdhLWcg3wnncw - FullStack

2

我找不到关于Sourcetree的最终解决方案,但是我知道它使用来自存储库的 Git hooks。这不是最终解决方案,但可以提供帮助。

创建文件.git/hooks/prepare-commit-msg并赋予执行权限chmod +x .git/hooks/prepare-commit-msg,并使用此示例的代码作为范例。你可以在网络上找到更多的示例。

#!/bin/bash

COMMIT_MSG_FILE=$1
BRANCH_NAME=$(git symbolic-ref --short HEAD | sed 's/\(.*-[0-9]*\).*/\1/')
BRANCH_NAME="${BRANCH_NAME##*/}"
if [ -n "$BRANCH_NAME" ] &&
   [ $(head -1 ${COMMIT_MSG_FILE}|grep -c "${BRANCH_NAME}" ) = 0 ]
then
  sed -i.bak -e "1s/^/${BRANCH_NAME} /" ${COMMIT_MSG_FILE}
fi

这在终端中可以完美运行,但遗憾的是Sourcetree不会在提交消息输入中显示它。Sourcetree仅在您按下提交按钮后使用钩子,结果是带有jira卡片前缀的消息。

您可以进一步配置全局模板,但仅对新的git clones/git init生效。对于已经存在的克隆版本,您仍需要复制钩子。以下是另一个脚本,它将帮助您完成此过程,并得到来自此链接的一些帮助:

# Creating file on your home folder
mkdir -p ~/.git-templates/hooks
cat << 'EOF' > ~/.git-templates/hooks/prepare-commit-msg
#!/bin/bash
COMMIT_MSG_FILE=$1
BRANCH_NAME=$(git symbolic-ref --short HEAD | sed 's/\(.*-[0-9]*\).*/\1/')
BRANCH_NAME="${BRANCH_NAME##*/}"
if [ -n "$BRANCH_NAME" ] &&
   [ $(head -1 ${COMMIT_MSG_FILE}|grep -c "${BRANCH_NAME}" ) = 0 ]
then
  sed -i.bak -e "1s/^/${BRANCH_NAME} /" ${COMMIT_MSG_FILE}
fi
EOF
chmod +x ~/.git-templates/hooks/prepare-commit-msg

# Use this line to config as default for all new git clones/init
git config --global init.templatedir '~/.git-templates'

# Use this line to create a alias to install this hook on existing local git repos
echo "
alias git_install_commit_template_hook='ln -s ~/.git-templates/hooks/prepare-commit-msg .git/hooks/prepare-commit-msg'
" >> ~/.bash_aliases
source ~/.bash_aliases

为什么在我打开消息输入时,sourcetree不执行pre-hook?是的,这很糟糕,因为它听起来更像是post-commit-message。 Sourcetree与git进行接口,并拥有自己的生命周期。 在这种情况下,直到您点击提交按钮之前,消息字段才不会与git交互。他们可以改进它,这应该不难,但可能比我知道的工作量更多= P


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接