git commit -a -m"fixed this pesky issue"
提交后,在git log中,消息显示为:
fixed this pesky issue. ticket number: #1234
git commit -a -m"fixed this pesky issue"
提交后,在git log中,消息显示为:
fixed this pesky issue. ticket number: #1234
你错过了一个钩子。你想要的是 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
)进行提交。很少情况下你可以在单行提交消息中编写足够的信息。此外,在提交之前,这将让你看到消息,以防钩子没有完全达到你的预期。
prepare-commit-msg
钩子,与commit-msg
相比,它接受更多参数。然后,您可以检查消息是来自文件、模板等,以避免在不需要时附加问题编号。.git/hooks/prepare-commit-msg
中使用以下脚本,当您在名为foo-123
的特性分支上工作时,每次进行提交时都会在第三行添加[#123]
。#!/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
commit -m
命令时无法按预期工作,因为它会在提交信息前加上故事编号。如果你将正则表达式中的 ^
替换为 $
,那么它就可以在两种情况下都正常工作。 - Geekfish这样可以在提交信息的开头添加分支名称。这是通过使用prepare-commit-msg钩子实现的。 它适用于“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
这是一个针对任何问题/工单编号提交信息的完整解决方案:
prepare-commit-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并将其复制到该目录中,以应用于您所有的存储库。如果有人正在寻找快速解决方案,这可能会很有用-具有改进和相当好的可移植性(将其添加到新框中只是一个简单的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
快速添加更改到仓库中。
git commit --file=myMultiLineCommentFile
命令,是否仍然可以使用commit-msg
钩子呢? - VonCcommit-msg
钩子 - 除了完全自动合并提交(即没有冲突,没有--no-commit
)。但这对于OP来说不应该是问题。(这实际上是一个小错误/疏忽。最近他们为自动合并添加了prepare-commit-msg
钩子的支持,但我认为post-commit
和commit-msg
仍然缺失。) - Cascabelgit symbolic-ref HEAD
始终以refs/heads
开头,而不是issue
? - xi.lin-m
可以多次使用,每次都会向提交消息中添加一行新的内容。这是我大多数时候提交代码的方式;传递给-m
的字符串本身也可以是一个多行字符串,但其构造方式取决于所使用的 shell。 - Alex Povel