背景
GitLabテンプレートを複数リポジトリで使用しているのですが、MRのテンプレートを修正したいことがあって、1個1個のmdファイルを修正するのがダルい。
グループレベルのテンプレートはPREMIUMクラスで使えるのですが、gitのコマンドを使って1つのtemplateプロジェクトを参照するようにして、templateの修正箇所を一元化できるようにできないか試してみました。
git submodule使ってみた(結果:NG)
手順
- templateというプロジェクトを作って、そのプロジェクトのroot直下にmerge_request_templates/Template.mdを置いた
-
go-sampleというプロジェクトのroot直下でtemplateプロジェクトを.gitlabという名前でサブモジュールとして置いた
-
git submodule add git@gitlab.com:esper2/template.git .gitlab
したものをcommit & pushした
-
MRを作ってみたのですが、上手くいかないorz
git subtree使ってみた(結果:OK)
手順
- sub-originという名前のリモートリポジトリを追加した(sub-originの内容はtemplateプロジェクト)
git remote add sub-origin git@gitlab.com:esper2/template.git
- リモートリポジトリのmasterブランチを.gitlabというフォルダ名で取り込む(clone)
-
git subtree add --prefix=.gitlab sub-origin master
(※)
-
- 上記の内容をpushした
※コミットログを汚さないためにgit subtree addには--squashをつけた方が良さそう
git subtree add --prefix=.gitlab sub-origin master --squash
考察
何故git submoduleだと上手くいかなかったか
-
公式ドキュメントを見てみると、以下の通り
-
git submodule init でローカルの設定ファイルを初期化し、次に git submodule updateしないとTemplate.mdが置かれた状態にならないので、GitLabのGUIからMRを出した時にTemplate.mdを参照できない
サブモジュールを含むプロジェクトのクローン
ここでは、内部にサブモジュールを含むプロジェクトをクローンしてみます。
デフォルトでは、サブモジュールを含むディレクトリは取得できますがその中にはまだ何もファイルが入っていません。
何故git subtreeだと上手くいくか
- git subtreeではtemplateのブランチをcloneしており、.gitlab/merge_request_templates以下にTemplate.mdが置かれるため
おまけ:templateを更新するときは
手順
- templateプロジェクトを更新する
- templateをcloneしたプロジェクトでgit subtree pullする
git subtree pull --prefix=.gitlab sub-origin master --squash
参考