LoginSignup
4
2

More than 3 years have passed since last update.

git hookでコミットメッセージを自動生成

Posted at

最近AtCoderのbeginer contestにリアルタイムで参加するようになり、競プロが楽しくなってきた。

5月から参加し始めたので、約3ヶ月が経ちソースコードもそこそこ増えてきた。
せっかくなのでgithubで管理してコードが溜まっていく様子を眺めてみたいと思った。

とはいえgithubにpushしたところでACしたコードは後から手を加えないと思うので、
今回はgit hookの勉強のため、コミットメッセージを自動生成してみることを目的にしようと思う。

git hookとは

gitのコマンドのあれやこれやを使う前や後に自動で任意の処理を加えることができるスクリプト。

使い方などについては、記事の最後に参考記事のリンクを貼っておくのでこの記事では省略し、実例として紹介する。
公式のマニュアルはここで見ることができる。

コミットメッセージを自動生成

今回はgit commitを叩いたときに
prepare-commit-msgで、デフォルトのコミットメッセージが記述されているようにする。
AtCoderの解答をgit管理するので、デフォルトのコミットメッセージは自分の提出一覧へのリンクにすることにする。

自分の提出一覧へのリンクはhttps://atcoder.jp/contests/{コンテスト名}/submissions/meとなっている。

私の場合、コンテストのコードは以下のようにコンテスト名でディレクトリを分けており、偶然にも提出一覧へのリンクの{コンテスト名}と同じものをディレクトリ名にしていたので、ステージングしたファイルのディレクトリ名からURLが生成できる。

AtCoder
│  .gitignore
│  Source.cpp (雛形)
│
├─ABC126
│     Source.cpp
├─ABC127
│     Source.cpp
├─ABC129
│     Source.cpp
├─以下略

ステージングしたファイル名を取得

普段git statusをするときは特にオプションを付けていないので調べてみたところ、とても簡素にファイル名だけ表示してくれる-sコマンドがあった。

$ git status -s
 M ABC126/Source.cpp

prepare-commit-msg

上述したファイル名からディレクトリ名だけ切り出して、URLをつなげてコミットメッセージへ流す。出来上がったものは以下の通り。

prepare-commit-msg
#!/bin/sh

if [ "$2" == "" ] ; then
    # addしたファイル名からURLを作る
    echo "https://atcoder.jp/contests/`git status -s | awk -F '[ /]' '{print $3}'`/submissions/me `cat $1`" > $1
fi
git commit後
https://atcoder.jp/contests/ABC126/submissions/me 
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
#   modified:   ABC126/Source.cpp
#

ShellScriptはあまり得意ではない。

参考記事

Git フックの基本的な使い方
git hook はじめの一歩

4
2
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
4
2