12

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

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

唯一的共同点是我需要第二个“-”之前的所有内容。

任何帮助是极大的赞赏!!!

4

1 回答 1

20

好的,首先,这个:

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

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

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

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

其余的只是基本的脚本。在 bash 中你可以直接使用正则表达式,在旧的 sh 中你可以调用expror sed。两者sedtr都可以大写,但 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

以上只是零碎测试,但应该可以工作。

于 2013-11-09T02:25:00.537 回答