2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gitのデフォルトメッセージに前回のメッセージを入れておく

Last updated at Posted at 2017-03-19

IntelliJなどでコミットする時に、デフォルトで前回のコミットメッセージが出ているのがなかなか便利なので、それをコマンドラインのgitのコミットでもやってみた。

prepare-commit-msghookを使って実現する。
前回のコミットメッセージにしたくないこともあるので、デフォルトではコメントとして表示することにする。

環境

  • Mac OS X Yosemite 10.10.5
  • Git 2.11.1

gitテンプレートディレクトリを作成

特定のレポジトリではなく、PC上で扱う全てのレポジトリのコミットをhookするため、グローバルの.gitテンプレートディレクトリを準備する。
(なお、特定のレポジトリでだけhookしたい場合は、以下で作るpre-pushファイルをレポジトリの.git/hooks/におけばよい)

mkdir -p ~/.git_template/hooks

.gitのテンプレートに.git_templateを指定

git config --global init.templatedir ~/.git_template/

これで新たにgitレポジトリを作ったりcloneすると.git_templateディレクトリの設定が有効になる。

hookファイル作成

vi ~/.git_template/hooks/prepare-commit-msg

内容は以下のようにする。

#!/bin/sh

if [ "$2" == "" ] ; then
  git log > /dev/null 2>&1
  # 初回のコミットじゃなかったら
  if [ $? -eq 0 ]; then
    # 前回のコミットメッセージをデフォルトに設定
    echo "\n# `git --no-pager show -s --format=%B HEAD | awk -v RS='\n' -v ORS='\n# ' '{print}'``cat $1`" > $1
  fi
fi

内容

$1がコミットメッセージ用のファイル名になっている(.git/COMMIT_EDITMSGなど)。

git log > /dev/null 2>&1

↑初回のコミットかどうかの判定用。

git --no-pager show -s --format=%B HEAD

↑一つ前のコミットメッセージ

awk -v RS='\n' -v ORS='\n# ' '{print}'

↑改行を「改行# 」に変換。

hookファイルのパーミッション変更

パーミッションを変えて実行可能にする
これをしないとhookされない。

chmod +x ~/.git_template/hooks/prepare-commit-msg

結果

以上の設定をすると、commitする際に

  1
  2 # first commit
  3 #-
  4 #-
  5 # Please enter the commit message for your changes. Lines starting
  6 # with '#' will be ignored, and an empty message aborts the commit.
  7 # On branch master
  8 # Changes to be committed:
  9 #»------new file:   b.txt
 10 #

のように前回のコミットメッセージがコメントとして表示されるようになる。

参考

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?