Append ticket number using git commit hooks?

前端 未结 6 1591
[愿得一人]
[愿得一人] 2020-12-24 02:21

So my branch is named after bugtracker ticket number, something like \"issue-1234\", and we have a convention to always write down ticket number in commit message. I\'m wond

相关标签:
6条回答
  • 2020-12-24 02:48

    Here's a complete solution for any kind of issue/ticket numbering commit messages:

    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
    

    Put it into repository's .git/hooks directory to apply only to the repo, or set up core.hooksPath in ~/.gitconfig and copy to that directory to apply to all of your repositories.

    See in my config files repository besides other usefull scripts.

    0 讨论(0)
  • 2020-12-24 02:53

    You missed a hook. The one you want is commit-msg:

    This hook is invoked by git commit, and can be bypassed with --no-verify option. It takes a single parameter, the name of the file that holds the proposed commit log message. Exiting with non-zero status causes the git commit to abort.

    So for example:

    #!/bin/sh
    
    ticket=$(git symbolic-ref HEAD | awk -F- '/^issue-/ {print $2}')
    if [ -n "$ticket" ]; then
        echo "ticket #$ticket" >> $1
    fi
    

    That's a very naive parsing of your branch name, and it's simply appended to the commit message on its own line. Modify it if that's not good enough for you.

    Of course, I'd actually recommend doing this in prepare-commit-msg, and committing with git commit (without -m). It's very, very rare that you can actually write sufficient information in a single-line commit message. Further, that will let you see the message before the commit is made, in case your hook doesn't do quite what you want.

    0 讨论(0)
  • 2020-12-24 02:56

    Using pre-commit along with the giticket hook, works pretty well to have the ticket number in the commit automatically.

    0 讨论(0)
  • 2020-12-24 03:02

    You can as well use prepare-commit-msg hook, which accepts more parameters than commit-msg. Then you can check if the message is coming from a file, a template, etc to avoid appending the issue numbers when you don't want it.

    With the following script in .git/hooks/prepare-commit-msg when you are working in a feature branch named foo-123, then [#123] will be added to the third line of every commit you make.

    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
    
    0 讨论(0)
  • 2020-12-24 03:04

    Another option would be to use git notes to add the ticket number information to the commit, using one of the hooks you mention.
    (See "Notes to self" blog post entry for more on the notes mechanism)

    0 讨论(0)
  • 2020-12-24 03:12

    This way you can add branch name to the start of commit message. It's prepare-commit-msg hook. Work both for "git commit -m" and "git commit" commands. The option is file .git/hooks/pre-commit.skip which contains a list of branches you don't want to auto-prepend.

    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
    
    0 讨论(0)
提交回复
热议问题