このドキュメントではRedmineでGitを連携させる方法について記述する。
環境
OS:Debian7
Redmine version 2.3.1.stable
git version 1.7.10.4
apt-getでRedmineとgitをインストールしている。
gitリポジトリの作成してSmartHTTP経由参照できるようにする。
リポジトリの作成
Webサーバからアクセスできる権限で、リポジトリを作成する。
$mkdir -p /var/git/test.git
$cd /var/git/test.git
$git --bare init
$git update-server-info
$chown -R www-data .
パスワードファイルの作成
$htdigest -c /var/git/git.htdigest Git admin
Apacheの設定
以下のファイルにgitリポジトリの情報を追加して、git-http-backendが動作するようにする。
/etc/apache2/sites-available/default
/etc/apache2/sites-available/default
SetENV GIT_PROJECT_ROOT /var/git
SetENV GIT_HTTP_EXPORT_ALL
ScriptAlias /git "/usr/lib/git-core/git-http-backend"
<Location /git>
AuthType Digest
AuthDigestProvider file
AuthName "Git"
AuthUserFile /var/git/git.htdigest
Require valid-user
Order allow,deny
Allow from all
</Location>
クライアントで確認
以上の設定でHTTP経由でclone,pushが行えるようになる。
$git clone http://debian/git/test
# ローカルレポジトリの操作
$ git push origin master
Username for 'http://debian': admin
Password for 'http://admin@debian':
Counting objects: 5, done.
Writing objects: 100% (3/3), 263 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://debian/git/test
2eb5859..62f3a48 master -> master
Redmineとリポジトリの関連
プロジェクトにリポジトリの追加
任意のプロジェクトで「設定」を選択して「リポジトリ」タブを選ぶ。
「新しいリポジトリ」を押下すると次の画面が表示される。
下記のように設定をする。
項目 | 設定 |
---|---|
バージョン管理システム | Git |
メインリポジトリ | チェックON |
識別子 | test ... 任意の値 |
リポジトリのパス | 先に設定したGitへのパス /var/git/test.git |
パスのエンコーディング | ブランク ※デフォルトでUTF-8 |
ファイルとディレクトリの最新コミットを表示する | ON |
ここまで行うと、もしリポジトリにコミットが存在すれば、各プロジェクトのリポジトリ画面には下記のように表示される。
チケットとの連携
「管理」→「設定」のリポジトリタブを選択する。
ここで以下の設定を行う。
項目 | 設定 |
---|---|
コミットを自動取得する | チェックON |
リポジトリ管理用のWebサービスを有効にする | チェックON |
APIキー | のちに使用するので、キーの生成を行いAPIキーを控えておく |
参照用キーワード | コミットログにチケットを関連付けるためのキーワード。以下のようにコミットログに記述すると関連づく refs #12 |
修正用キーワード | コミット時にステータスを遷移させるためのキーワード。 適用されるステータスを「終了」にしておく |
次に、pushが発生した場合にリポジトリを即更新するようにする。これをおこなわないと、リポジトリ画面を開くまで、チケットとリポジトリが関連づかない。
gitのリポジトリ中のpost-receiveフックを作成する。
/var/git/test.git/hooks/post-receive
# !/bin/sh
wget http://localhost/redmine/sys/fetch_changesets?key=作成したAPIキー
このとき、スクリプトのオーナーがwww-data等のWebサーバーからアクセスできるものになっていること。
以降、クライアントからpushを行った場合に、「refs #123」「fixes #123」等のコミットログが存在していれば下記のようにチケットとリポジトリが関連づく
チケット番号のないpushを拒否するようにする。
下記のupdateフックスクリプトを利用する。
https://github.com/bleis-tift/Git-Hooks
このupdateスクリプトは、push時のコミットで、一行目がチケット番号でないものがあったら、拒否するようになっている。
以下はTortoiseGITでpushが失敗した例である。
コミットログの修正方法
直前のコミットログの修正方法
下記のコマンドを入力して、コミットログを修正する。
git commit --amend
特定のコミットログを修正する
rebaseを使用する。
2個前のコミットを直す場合は次のようにする。
git rebase -i HEAD~2 -i
次のような画面が表示される。
修正したいコミットのpickをeditに変更する。
以下のコマンドを実行してコミットをし直し、rebaseを続ける。
$ git commit --amend -m "refs #12"
$ git rebase --continue
これで履歴が変わるのでpushを再度実行する。
参考
Redmine と Git の連携設定
http://easyramble.com/connect-redmine-with-git.html
[Git][Deiban] Debian GNU/Linux で Git を Smart HTTP Transport で使う
http://d.hatena.ne.jp/next49/20130415/p2
Redmine Guide日本語訳 > リポジトリ
http://redmine.jp/guide/RedmineRepositories/
Redmine とリポジトリの同期設定
http://d.hatena.ne.jp/yun_kichi/20100127/1264593665