使用git commit hooks附加票号?

时间:2011-04-28 19:15:04

标签: git githooks

所以我的分支机构以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

7 个答案:

答案 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-commitgiticket挂钩,可以很好地将票证号自动提交。

答案 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 快速向存储库添加更改。