web-dev-qa-db-ja.com

Gitのブランチ名をコミットメッセージに追加する方法は?

コミットメッセージにハッシュとしてgitのブランチ名を自動的に追加するBashスクリプトに関するヘルプが必要です。

90
Tomer Lichtash

prepare-commit-msgまたはcommit-msggithook を使用します。

PROJECT/.git/hooks/ディレクトリにはすでにサンプルがあります。

セキュリティ対策として、使用する各リポジトリでこのようなフックを手動で有効にする必要があります。ただし、スクリプトをコミットして、すべてのクローンで.git/hooks/ディレクトリにコピーできます。

47
ninjagecko

例としてのcommit-msgスクリプトを次に示します。

#!/bin/sh
#
# Automatically adds branch name and branch description to every commit message.
#
NAME=$(git branch | grep '*' | sed 's/* //') 
DESCRIPTION=$(git config branch."$NAME".description)

echo "$NAME"': '$(cat "$1") > "$1"
if [ -n "$DESCRIPTION" ] 
then
   echo "" >> "$1"
   echo $DESCRIPTION >> "$1"
fi 

次のコミットメッセージを作成します。

[branch_name]: [original_message]

[branch_description]

私は問題番号をbranch_nameとして使用しています。問題の説明はbranch_descriptionコマンドを使用してgit branch --edit-description [branch_name]に配置されます。

これで見つけることができるブランチの説明の詳細 Q&A

コード例は、次の Gist に格納されています。

167
shytikov

ブランチ名をコミットメッセージに追加する少し単純なスクリプトbeforeを編集します。そのため、変更または削除する場合は可能です。

このファイルを作成します。git/hooks/prepare-commit-msg

#!/bin/bash

branchPath=$(git symbolic-ref -q HEAD) #Somthing like refs/heads/myBranchName
branchName=${branchPath##*/}      #Get text behind the last / of the branch path

firstLine=$(head -n1 $1)

if [ -z "$firstLine"  ] ;then #Check that this is not an amend by checking that the first line is empty
    sed -i "1s/^/$branchName: \n/" $1 #Insert branch name at the start of the commit message file
fi
28
Pylinux

Prepare-commit-msgフックとpre-commitフックを組み合わせて使用​​できます。

。git/hooks/prepare-commit-msg

#!/bin/sh

BRANCH=`git branch | grep '^\*' | cut -b3-`
FILE=`cat "$1"`
echo "$BRANCH $FILE" > "$1"

。git/hooks/pre-commit

#!/bin/bash

find vendor -name ".git*" -type d | while read i
do
        if [ -d "$i" ]; then
                DIR=`dirname $i`
                rm -fR $i
                git rm -r --cached $DIR > /dev/null 2>&1
                git add $DIR > /dev/null 2>&1
        fi
done

権限を設定

Sudo chmod 755 .git/hooks/prepare-commit-msg
Sudo chmod 755 .git/hooks/pre-commit
25
Farid Movsumov

prepare-commit-msgファイルに以下のコードを追加します。

#!/bin/sh
#
# Automatically add branch name and branch description to every commit message except merge commit.
#

COMMIT_EDITMSG=$1

addBranchName() {
  NAME=$(git branch | grep '*' | sed 's/* //') 
  DESCRIPTION=$(git config branch."$NAME".description)
  echo "[$NAME]: $(cat $COMMIT_EDITMSG)" > $COMMIT_EDITMSG
  if [ -n "$DESCRIPTION" ] 
  then
     echo "" >> $COMMIT_EDITMSG
     echo $DESCRIPTION >> $COMMIT_EDITMSG
  fi 
}

MERGE=$(cat $COMMIT_EDITMSG|grep -i 'merge'|wc -l)

if [ $MERGE -eq 0 ] ; then
  addBranchName
fi

Merge-commitを除くコミットメッセージにブランチ名を追加します。 merge-commitにはデフォルトでブランチ情報がありますですので、余分なブランチ名は不要で、メッセージが見苦しくなります。

9
Tim

一番上の答えに基づいて構築されたTimの答えに触発され、prepare-commit-msgフックが 引数の種類が発生していることを示す として受け取ることがわかります。デフォルトのprepare-commit-msgに見られるように、$ 2が「マージ」の場合、それはマージコミットです。したがって、ケーススイッチを変更して、TimのaddBranchName()関数を含めることができます。

ブランチ名を追加する方法と、デフォルトのprepare-commit-msg.sampleフック。

prepare-commit-msg

#!/bin/sh

addMyBranchName() {
  # Get name of current branch
  NAME=$(git branch | grep '*' | sed 's/* //')

  # First blank line is title, second is break for body, third is start of body
  BODY=`cut -d \| -f 6 $1 | grep -v -E .\+ -n | cut -d ':' -f1 | sed '3q;d'`

  # Put in string "(branch_name/): " at start of commit message body.
  # For templates with commit bodies
  if test ! -z $BODY; then
    awk 'NR=='$BODY'{$0="\('$NAME'/\): "}1;' $1 > tmp_msg && mv tmp_msg "$1"
  else
    echo "title\n\n($NAME/):\n`cat $1`\n" > "$1"
  fi
}

# You might need to consider squashes
case "$2,$3" in
  # Commits that already have a message
  commit,?*)
  ;;

  # Messages are one line messages you decide how to handle
  message,)
  ;;

  # Merge commits
  merge,)
    # Comments out the "Conflicts:" part of a merge commit.
    Perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1"
  ;;

  # Non-merges with no prior messages
  *)
    addMyBranchName $1
  ;;
esac
4
Novice C

(すべてのプロジェクトで)グローバルにしたい場合:

shytikov's answer の内容でgit-msgファイルを作成し、それをいくつかのフォルダーに入れます。

mkdir -p ~/.git_hooks
# make it executable
chmod a+x ~/.git_hooks/commit-msg

フックを有効にします:

git config --global init.templatedir '~/.git_hooks'

使用する各プロジェクトでgit initを再度使用します。

3
Maroun

GNU sed]の代わりにBSD sedを使用しているため、これらのソリューションをMacOSで動作させるのに問題がありました。それでも仕事をするスクリプト。まだ.git/hooks/pre-commitを使用しています:

#!/bin/sh
BRANCH=$(cat .git/HEAD  | cut -d '_' -f2)
if [ ! -z "$BRANCH" ]
then
    echo "$BRANCH" > "/Users/username/.gitmessage" 
else
    echo "[JIRA NUMBER]" > "/Users/username/.gitmessage"
fi 

これは、functional-desc_JIRA-NUMBERに類似したブランチ命名標準を前提としています。ブランチ名がJiraチケット番号のみの場合、パイプからf2までのすべてを単純に削除できます。また、ホームディレクトリに.gitmessageという名前のファイルが必要です。

2
PhPGuy