所以我的分支机构以bugtracker票号命名,类似“issue-1234”,我们有一个约定,总是在提交消息中写下票号。我想知道当我正在处理issue- *分支时,是否可以自动将票号附加在提交消息中,而我没有明确地输入它。
我查看了git commit hooks,即pre-commit,prepare-message和post-commit,但似乎没有一个能够做我想做的事情。提交后挂钩很接近,但您无法修改使用-m。
提交的消息重申一下,我想知道这是否可行:
On branch:issue-1234
git commit -a -m"fixed this pesky issue"
提交后,在git log中,它将消息显示为:
fixed this pesky issue. ticket number: #1234
答案 0 :(得分:18)
commit-msg
:
此挂钩由git commit调用,可以使用--no-verify选项绕过。它需要一个参数,即包含建议的提交日志消息的文件的名称。退出非零状态会导致git commit中止。
例如:
#!/bin/sh
ticket=$(git symbolic-ref HEAD | awk -F- '/^issue-/ {print $2}')
if [ -n "$ticket" ]; then
echo "ticket #$ticket" >> $1
fi
这是一个非常天真的分支名称解析,它只是附加到自己的行上的提交消息。修改它,如果这对你不够好。
当然,我实际上建议您在prepare-commit-msg
中执行此操作,并提交git commit
(不使用-m
)。您可以在单行提交消息中实际编写足够的信息是非常非常罕见的。此外,这将允许您在提交之前查看消息,以防您的钩子没有完成您想要的操作。
答案 1 :(得分:7)
你也可以使用prepare-commit-msg
钩子,它接受的参数多于commit-msg
。然后,您可以检查邮件是来自文件,模板等,以避免在您不想要时附加问题编号。
当您在名为.git/hooks/prepare-commit-msg
的功能分支中工作时,在foo-123
中使用以下脚本,然后[#123]
将添加到您所做的每个提交的第三行。
More information in this post I wrote
#!/bin/sh
if [ x = x${2} ]; then
BRANCH_NAME=$(git symbolic-ref --short HEAD)
STORY_NUMBER=$(echo $BRANCH_NAME | sed -n 's/.*-\([0-9]\)/\1/p')
if [ x != x${STORY_NUMBER} ]; then
sed -i.back "1s/^/\n\n[#$STORY_NUMBER]/" "$1"
fi
fi
答案 2 :(得分:2)
另一种选择是使用 git notes
将票号信息添加到提交中,使用您提到的其中一个钩子。
(有关笔记机制的更多信息,请参阅"Notes to self"博客文章)
答案 3 :(得分:2)
这样,您可以将分支名称添加到提交消息的开头。它是prepare-commit-msg钩子。 同时为#34; git commit -m"和" git commit"命令。该选项是文件.git / hooks / pre-commit.skip,其中包含您不想自动添加的分支列表。
BRANCH="$(git rev-parse --abbrev-ref HEAD)"
FILE_CONTENT="$(cat $1)"
skip_list=`git rev-parse --git-dir`"/hooks/pre-commit.skip"
if grep -E "^$BRANCH$" $skip_list; then
exit
fi
if [ $2 = "message" ]; then
echo $BRANCH: $FILE_CONTENT > $1
else
echo $BRANCH: > $1
echo $FILE_CONTENT >> $1
fi
答案 4 :(得分:1)
以下是任何类型的问题/票证编号提交消息的完整解决方案:
准备提交-MSG
#!/bin/bash
# Append issue number / bug tracking URL to commit.
#
# If the branch name contains the issue number, it will append it to the
# commit message. Example:
#
# BRANCH NAME LINE TO APPEND
# feature/GH-123-emoji GitHub: #123
# WRIKE-123-add-payment Wrike: https://www.wrike.com/open.htm?id=123
# UNKNOWN-123 Issue: #123
branchName=`git rev-parse --abbrev-ref HEAD`
IFS=- read issueTracker issueNumber <<< $(echo $branchName | sed -nr 's,([a-z-]+/)?([A-Z]+-[0-9]+)-.+,\2,p')
if [[ -z $issueNumber ]]; then
exit 0
fi
case "$issueTracker" in
WRIKE)
line="Wrike: https://www.wrike.com/open.htm?id=$issueNumber"
;;
GH)
line="GitHub: #$issueNumber"
;;
GL)
line="GitLab: #$issueNumber"
;;
*)
line="Issue: #$issueNumber"
;;
esac
# If the commit message already contains the line (`--amend`), then do
# not add it again.
if ! ( grep "$line" "$1" > /dev/null ); then
sed -i.bak -e "/# Please enter the commit message for your changes./ s,^,$line\n\n," $1
fi
将其放入存储库的.git/hooks
目录以仅应用于存储库,或在~/.gitconfig
中设置core.hooksPath并复制到该目录以应用于所有存储库。
除了其他有用的脚本外,请参阅my config files repository。
答案 5 :(得分:0)
结合使用pre-commit和giticket挂钩,可以很好地将票证号自动提交。
答案 6 :(得分:0)
因为这可能对寻求快速解决方案的人有用 - 具有改进的可能性和相当好的可移植性(将其添加到新框是简单的 bash source git-tricks.sh
)
我们的分支名称通常采用以下形式:
<work-category>/<ticket-id>-<short-description>
喜欢:bug/ID-1234-bad-button-color
然后我有以下别名:
alias git-branch-name='git rev-parse --abbrev-ref HEAD'
bug/ID-1234-bad-button-color
alias git-branch-ticket='git-branch-name | grep -oP "^[^/]*/\K[^-]*-[0-9]+"'
ID-1234
(如果问题的作者是:'git-branch-name | grep -oP "^issue-\K[0-9]+"'
)最后一个:
alias git-describe-commit='git commit --all --edit --message "[$(git-branch-ticket)] --edit this--"'
这使我可以使用 git-describe-commit
快速向存储库添加更改。