我目前的分支命名约定是这样的:
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
唯一的共同点是我在第二个' - '之前需要一切。
非常感谢任何帮助!!!
答案 0 :(得分:15)
好的,首先,这个:
BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')
是主要的矫枉过正:-)使用:
branch=$(git symbolic-ref --short HEAD) || ...
获取当前分支名称。 ||
之后的部分是“如果你不在分支上该怎么办”(即,如果你处于“超级头”模式) - 你必须自己决定。 (您当前的代码将BRANCH_NAME设置为空字符串;为此,您甚至不需要||
部分,但您可能希望将-q
或2>/dev/null
添加到避免来自symbolic-ref的“致命:”消息。)
其余的只是基本的脚本。在bash中,您可以直接使用正则表达式,在旧版本中,您可以调用expr
或sed
。 sed
和tr
都可以大写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
以上只是零碎测试,但应该有效。