やりたいこと
gitレポジトリをsubversionレポジトリにミラーリングする。
git user -> git server -> svn server -> svn user
ポイントはgit server
とsvn server
のつなぎ。
さてどうしたものか。。。
とりあえず勉強だ!
Git Server-Side Hook(調査)
Gitのサーバーサイドフックは以下の3種類がある。
-
pre-receive
- Pushリクエストをクライアントから受け付けた時に発動する(まだPushは完了していない)。
pre-receive
はPushリクエスト一つにつき一度しか発動しない。non-zero
を返せば、失敗となり、Pushの処理は中止される。0
を返せば成功し、Pushの処理は継続される。
- Pushリクエストをクライアントから受け付けた時に発動する(まだPushは完了していない)。
-
update
- 発動タイミングや成功・失敗は
pre-receive
と同様。update
はブランチごとに発動する(Pushリクエストに含まれるコミットがそれぞれ異なるブランチのコミットとなっているような場合)。
- 発動タイミングや成功・失敗は
-
post-receive
- Pushの処理完了後に発動する。
GitLabでサーバーサイドフックを使う場合には、以下を参照。
For Omnibus installs the path is usually /var/opt/gitlab/git-data/repositories/<group>/<project>.git.
とあるが、わたしの環境ではrepositories
の下はHash値になっている。
GitLabのAdmin Area>Projects以下にプロジェクト毎のページがあり、Gitaly relative path:
という項目を参照すればプロジェクトのHash値がわかる。
Git Server-Side Hook(作成)
私はDockerを使ってGitLabサーバーを構築している。まずはサーバーにログインする。(gitlab
という名前のGitLabサーバーインスタンスの想定)
% docker exec -it gitlab /bin/bash
フックを作成する。
# cd /var/opt/gitlab/git-data/repositories/@hashed/<group>/<project>.git/
# mkdir custom_hooks
# cd custom_hooks
# touch pre-receive update post-receive
# chmod +x pre-receive update post-receive
pre-receive
フックに以下の内容を記載してクライアントからサーバーへPushしてみる。Pushに失敗することを確認する。
#/bin/bash
exit 1