使用部分分支名称添加Git提交消息

时间:2013-11-09 01:53:52

标签: regex git branch

我目前的分支命名约定是这样的:

ticket-45-my-new-feature-branch-description

我目前在.git / hooks / prepare-commit-msg文件中使用此代码,以使用分支名称预先添加每个提交消息:

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')
if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then
    echo "[$BRANCH_NAME] $(cat $1)" > $1
fi

最终结果:

[ticket-45-my-new-feature-branch-description] test commit

我想要完成的是这样输出:

[ticket-45] test commit

布朗尼指出,如果我们可以利用它:

[TICKET-45] test commit

我希望保留我的描述性分支名称,但会在提交消息中截断前置文本。我确定我必须使用一些正则表达式,但我真的不知道如何实现这一目标。我应该提一下,我们有几个项目同时进行,因此分支名称是不同的,如下所示:

ticket-123-branch-name
abc-22-my-branch
ua-11-my-feature

唯一的共同点是我在第二个' - '之前需要一切。

非常感谢任何帮助!!!

1 个答案:

答案 0 :(得分:15)

好的,首先,这个:

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')

是主要的矫枉过正:-)使用:

branch=$(git symbolic-ref --short HEAD) || ...

获取当前分支名称。 ||之后的部分是“如果你不在分支上该怎么办”(即,如果你处于“超级头”模式) - 你必须自己决定。 (您当前的代码将BRANCH_NAME设置为空字符串;为此,您甚至不需要||部分,但您可能希望将-q2>/dev/null添加到避免来自symbolic-ref的“致命:”消息。)

其余的只是基本的脚本。在bash中,您可以直接使用正则表达式,在旧版本中,您可以调用exprsedsedtr都可以大写ify,但sed也可以执行正则表达式,所以看起来它是一个很好的候选者:

$ trimmed=$(echo $branch | sed -e 's:^\([^-]*-[^-]*\)-.*:\1:' -e \
    'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/')
$ echo $trimmed
TICKET-45

最后,这样做有点危险:

echo "some stuff $(cat $1)" > $1

因为你依赖于shell来扩展$(cat $1)之前它会截断> $1部分的输出文件。 (显然它有效,但是你会受到变幻莫测的影响。)最好使用临时文件,或者使用另一个sed但是就地:

sed -i .bak -e "1s:^:[$trimmed] :" $1
# or use -i '', but note minor warning in sed man pages

以上只是零碎测试,但应该有效。