RedmineとGitの連携にGit-Hooksを使ってみる

RedmineとGit連携に有用はGit-Hooksを使ってみました。


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