Gitポケットリファレンス
※ 主に上記2つの内容を多く含んでいます。
- コミットやプッシュなどリポジトリの操作を行う前後で、行う処理のこと。
[フック (プログラミング) - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%95%E3%83%83%E3%82%AF_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
フック(Hook)は、プログラム中の特定の箇所に、
利用者が独自の処理を追加できるようにする仕組みである。
また、フックを利用して独自の処理を追加することを「フックする」という。
定期的に自動処理を挟むことで、ラク出来るんじゃないかと思った。
- 事前にテストを実行
- コーディングスタイルの検査
- テンプレートのコミットメッセージを使う
- 自動でIssue番号などをメッセージに追加
- メール通知
- 継続的インテグレーション(CI)サーバーへの通知
✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
-
クライアントサイドフック
- コミットに関するもの ← (今回はこれについて)
-
サーバーサイドフック
- プッシュに関するもの
Gitポケットリファレンス p238
-
タイミング:コミットが呼ばれた直後
-
引数:なし
-
利用シーン
- 事前にテストを実行
- 行末の空白文字の検査
- ドキュメントの検査
- コーディングスタイルの検査
-
タイミング:コミットメッセージを編集する直前
-
引数1:コミットメッセージ格納ファイル
-
利用シーン
- テンプレートのコミットメッセージを使う
- 自動でIssue番号などをメッセージに追加
※ SourceTree だと「コミットメッセージ入力画面」に反映されなかった
※ 通常は「git commit」 -> エディタ起動時(vi, vim等)に反映されている
-
タイミング:コミットメッセージを編集し、エディタを終了した後
-
引数1:コミットメッセージ格納ファイル
-
利用シーン
- 文字数チェック
- チケット番号が入っているかなど
-
タイミング:コミット処理が終わった後
-
引数:なし
-
利用シーン
- リポジトリへはまだ反映されていないが編集しているファイルがあることを他の開発者に通知するのに利用できます。
- pre-commit
コミットが呼ばれた直後
- prepare-commit-msg
コミットメッセージを編集する直前
- commit-msg
コミットメッセージを編集し、エディタを終了した後
0以外の値を返して終了させることにより、異常終了にすることができます。
※ post-commitでは、すでにコミットが完了しているので、処理を中断することはできません。
git init
.git/hooks/
├─ applypatch-msg.sample
├─ commit-msg.sample
├─ post-commit.sample
├─ post-receive.sample
├─ post-update.sample
...
├─ prepare-commit-msg.sample
└─ update.sample
mv post-commit.sample post-commit ← ファイル名を変更
chmod +x commit-msg ← 実行権限を与える
※ .gitフォルダ内のファイルはgitで管理できないので、フックスクリプトを共有する場合は専用のフォルダを用意して各自.git/hooks/に移動しないとだめ
#! /usr/bin/env ruby #(1)シェバンの記述
if can_commit? #(2)コミットできるかのチェック
puts "#commit ok"
else
puts "#commit failure"
exit 1 #(3)異常終了する
end
1. シェバンの記述
./pre-commit のように実行できないといけないので、シェバンを記述します。
2. コミットできるかのチェック
can_commit? がtrueだったら、コミットができて、false だったら、コミットができないようになっています。
上記のサンプルコードを使用する場合は、can_commit?の部分を実際のコードに置き換えてください
3. 異常終了する
コミットしてはいけない場合は、exit 1で異常終了して、コミットができないことをGitに伝えないといけません。
Gitでコミット前にフックする方法 | SetucoCMSプロジェクト
- #!/bin/sh ← 主流
- #!/usr/bin/env ruby ← 主流
- #!/usr/bin/env php
- #!/usr/bin/env perl
- など...
特にシェルスクリプト、Rubyなどのサンプルコードが見つかる場合が多い
コミットメッセージにブランチ番号を挿入する
$ git checkout -b 1234-hoge
$ git commit -am "modified hoge"
[1234-hoge 6f595df] [1234] modified hoge
#!/usr/bin/env ruby
current_branch = `git br | grep '*'`.chomp.sub('* ', '') # ①
if /^(\d+)-.*/ =~ current_branch
commit_msgs = File.readlines(ARGV[0]) # ②
open(ARGV[0], 'w') {|file|
file.print "[#{$1}] " # ③
file.puts commit_msgs
}
end
まずは、①の部分で、現在のブランチ名を取得します。
次に、②の部分でコミットメッセージファイルの中身を読み込みます。
-mオプションでメッセージを指定している場合は、そのメッセージが入っていて、
エディタを立ち上げる場合は、デフォルトのメッセージが入ってます。
最後に③の部分で、メッセージの冒頭にチケット番号を挿入します。
Gitのコミットメッセージを書き換えるフックをRubyで書いてみる
コミットメッセージの先頭に「yyyy/dd/mm」または「yyyy/d/m」が無ければ、今日の日付を追加する。
先頭に「yyyy/dd/mm」または「yyyy/d/m」がある場合は追加しない。
$ git commit -am "commit message"
1f9ee20 2013/12/13 commit message
#!/usr/bin/env ruby
commit_msg = File.readlines(ARGV[0])
open(ARGV[0], 'w') do |file|
if /^\d{4}\/\d{1,}\/\d{1,}/ !~ commit_msg.first
today = Time.now.strftime("%Y/%m/%d")
file.puts "#{today} #{commit_msg}"
else
file.puts "#{commit_msg}"
end
end
-
特定のタイミングで任意の処理を行うことができる
-
工夫次第で面倒な処理が自動化出来る
-
好きな言語で記述出来るので、すぐ始めれる
単純で面倒な処理、Git フックに任せてみませんか?
Gitポケットリファレンス p240
Deploy : ローカルで変更した箇所をサーバー毎に手動で反映しないといけない。面倒、ミスりそう。
Test : とりあえず、不安定な箇所に部分的導入にしたい
CI : 定期的にTestが落ちてないか確認したい
javascript:(function(){var d=document;var s=d.createElement('script');s.src='https://gist.github.com/tuki0918/8438364/raw/slide.js';d.body.appendChild(s);})();