2015-11-05 529 views
2

我通常从JIRA问题站点创建分支。假设我的JIRA票据名称是“SOMEBUG-356:软件中的错误”,那么分支名称将是:“feature/SOMEBUG-356-bug-in-software”。在SourceTree中添加前缀提交消息

是否有可能将某种模板设置为SourceTree,它将添加一个前缀来提交具有我当前所在分支的JIRA票据名称的消息? (它会添加SOMEBUG-356前缀,如果我在分支上“功能/ SOMEBUG-356-bug-in-software”

回答

3

我不太确定这是否是正确的方式去做,在我的公司我们在创建分支时使用本地gitflow等。但是在所有提交中,我们强制执行正则表达式作为提交的一部分。您可以通过转到项目的.git文件夹并打开钩子文件夹来执行此操作,在那里您会看到提交-msg.sample文件中删除。样品所以说,提交 - 味精。在这个文件中加入类似。

#!/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 ticket。 如果您使用FishEye +坩埚,它可以成为一个令人难以置信的强大关系。

+0

您的解决方案是验证消息,而不是设置模板,所以它不是正确的答案。您可以使用git挂钩将验证,行为等添加到git生命周期。您会在同一个文件夹中找到每种类型钩子的一些示例。有一个名为'prepare-commit-msg.sample'的文件。 – voiski

+0

我同意这不是正确的答案,这强制执行提交的正则表达式检查。答案可以在这里找到https://stackoverflow.com/questions/5894946/how-to-add-gits-branch-name-to-the-commit-message – Antony

0

我找不到sourcetree的最终答案,但我知道它使用了存储库中的git hooks。这不是最终的解决方案,而是寒冷的帮助。

创建执行权chmod +x .git/hooks/prepare-commit-msg的文件.git/hooks/prepare-commit-msg,并根据this one使用以下代码作为示例。你可以在互联网上找到更多的例子。

#!/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生效。您仍然需要复制已存在克隆的钩子。这里更多的一个脚本这将帮助你在这个旅程中,来自this link一些帮助:

# 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执行前的钩?是的,这很糟糕,因为它听起来更像是一个提交后的消息。 Sourcetree与git建立了一个接口,并拥有自己的生命周期。在这种情况下,消息字段不会与git交互,直到您点击提交按钮。他们可以改进它,它不应该很难,但也许它有更多的工作比我知道= P