RedmineとGit連携に有用はGit-Hooksを使ってみました。
Table of Contents
1 Git-Hooksとは
Redmineの設定でリポジトリを追加し、gitのコミットログに"refs #[チケット番号]"を用いることで、Redmineのチケットにコミットのリンクが追加されます。
Git-Hooksはgitのコミットログに"refs #[チケット番号]"を自動的に付与と確認するスクリプトです。
gitのhooksスクリプトを用いているのでgit commitやgit pushの延長で自動的に実行されます。
1.1 制限と機能
初回のコミットログから全て"refs #[チケット番号]"がついてないとブランチのpushができません。
masterブランチでgit commitすることはできません。
git checkout -b [ブランチ名]でブランチを作成する必要があります。
masterブランチへの反映はgit mergeする必要があります。
id/[チケット番号]をつけたブランチ名の場合、コミットログに"refs #[チケット番号]"を明記しなくとも、自動で追加されます。
明記した場合は追加されません。
id/[チケット番号] bug/id/[チケット番号] dev/id/[チケット番号]/newfeature
2 インストール方法
2.1 Git-Hooksの入手
Githubで公開されています。
$ git clone https://github.com/bleis-tift/Git-Hooks
サーバ側とクライアント側にhooksスクリプトを導入します。
2.2 リポジトリの作成(サーバ)
リポジトリを作成します。
$ mkdir /path/to/repo $ cd /path/to/repo $ git init --bare
2.3 hooksの更新(サーバ)
hooksスクリプトupdateを追加します。
$ cp /path/to/Git-Hooks/update hooks/
これ以降"refs #[チケット番号]"がついていないコミットは拒否されます。
2.4 リポジトリのクローン(クライアント)
hooksスクリプトなしで初回のコミットをします。
初回のコミットログにも"refs #[チケット番号]"が必要なので、存在しないチケット番号0を指定しました(Redmineのチケット番号は1からです)。
$ git clone ssh://remote/path/to/repo $ cd repo $ # copy initial files $ git add * $ git commit -m "Initial commit refs #0" $ git push
これでmasterブランチに初期ファイル群がコミットされました。
2.5 hooksの更新(クライアント)
hooksスクリプトをクライアント側に追加します。
cp /path/to/Git-Hooks/{common.sh,commit-msg,pre-commit} .git/hooks/
これ以降、masterブランチでの作業は禁止されます。
3 コミットの確認
3.1 masterブランチでgit commit
$ git commit -m "git commit on master branch" can't commit on master branch. please commit on topic branch.
3.2 ブランチを作成して"refs #[チケット番号]"のコミットログ自動生成
$ git checkout -b id/1 $ # update files $ git add * $ git commit -m "Add file" [id/1 b5f21a8] Add file refs #1 1 file changed, 1 insertion(+) create mode 100644 [新しいファイル] $ git log commit b5f21a881dbdf892af566a06da7269a7f52bf517 Author: hiroom2 <mail@addr> Date: Sat Jul 4 08:38:19 2015 +0900 Add file refs #1 commit 6f5f67f77fd74ad1d1b6d090a947a7ad93f2beab Author: hiroom2 <mail@addr> Date: Sat Jul 4 07:41:56 2015 +0900 Initial commit refs #0
git mergeしてコミットする場合は以下の通りです。
git merge以降にgit branch -d id/1でブランチを削除しても良いです。
$ git checkout master $ git merge id/1 $ git push $ git log
ブランチをpushする場合は以下の通りです。
$ git push origin id/1 $ git branch -a * id/1 master remotes/origin/HEAD -> origin/master remotes/origin/id/1 remotes/origin/master