在Git提交信息中添加部分分支名称

13

我目前的分支命名规则如下:

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

共同之处只在于我需要第二个连字符之前的所有内容。

非常感谢任何帮助!!!


你好。请问你能否在按照以下建议后发布最终的脚本呢?谢谢! - user3341592
1个回答

21

好的,首先是这个:

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

太过头了 :-) 使用:

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

获取当前分支名字。在||后面的部分是“如果您不在分支上要做什么”的内容(即,如果您处于“游离头”模式下)-您必须自己决定。您当前的代码将BRANCH_NAME设置为空字符串;为此,您甚至不需要||部分,但您可能需要添加-q,或2>/dev/null,以避免来自符号参考的“致命”消息。

其余部分只是基本的脚本。在bash中,您可以直接使用正则表达式,在旧的sh中,您可以调用exprsed。both 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),因此它可以工作,但可能会受到shell的影响。最好使用临时文件,或者可能使用另一个sed进行原地编辑:

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

以上内容仅被分段测试过,但应该可以正常工作。


上面发布的脚本很可能来自我的博客,所以我应该为此感到羞愧。非常感谢torek提供的详细解释。现在我可以称自己为“稍微懂一点shell的新手”了 :) 我会用你的建议更新我的博客。 - bartosz.majsak
@bartosz.majsak:嘿,每个人都要从某个地方开始 :-) - torek
branch=$(git symbolic-ref --short HEAD) $trimmed=$(echo $branch | sed -e 's/^([^-]*-[^-])-./\1/' -e
'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/') sed -i .bak -e "1s/^/[$trimmed] /" $1 这会产生这样的提交信息:[]我的提交信息。可能的原因是什么?
- alex
@alex:您上面的引用中有$trimmed=而不是trimmed=(但如果我这样做,我会得到类似于=...:命令未找到的东西,所以我不确定这是否是您的原始内容)。 - torek
现在已经删除了 $,现在得到了 sed: 1: "1s/^/[FEATURE/PI-89] /": bad flag in substitute command: 'P' - alex
显示剩余2条评论

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