Gerrit/下位モジュールのマージ
Gerrit で下位モジュールを親プロジェクトにマージしたい場合 (つまり、別々にしておく意味がない場合) は、以下の手順に従います。 Gerrit へのプッシュを成功させるには、マージ コミットをプッシュするための Gerrit 権限が必要であることにご注意ください。
まず、下位モジュールのリビジョンをメイン モジュールのリポジトリに入れる必要があります。そうしないと、マージしたツリーをプッシュしようとしたときに、Gerrit はそれらをすべて新しいチェンジセットとして解釈しようとします。 Probably the easiest way to do this is to create a personal sandbox containing those revisions. これを行うには、下位モジュールのリモートをローカル リポジトリに追加し、それに基づいてサンドボックス ブランチを作成し、プッシュします:
$ git remote add -f submodule ssh://username@gerrit.wikimedia.org/submodule/name.git $ git checkout -b sandbox/username/merge-submodule submodule/master $ git push --set-upstream origin sandbox/username/merge-submodule
次に、メイン モジュールのクリーン コピーをチェック アウトしたいと思うことでしょう。 これには、先ほど作成した個人のサンドボックスが含まれます。
$ git clone ssh://username@gerrit.wikimedia.org:29418/mainmodule/name.git mainmodule $ cd mainmodule $ git review -s
このクリーン コピーでは、下位モジュールの更新は行わないことにご注意ください。 では、マージを開始します:
$ git merge -s ours --no-commit remotes/origin/sandbox/username/merge-submodule
次に、下位モジュールのレコードをメイン モジュールから除去する必要があります。 他に下位モジュールがない場合は、簡単なことです:
$ git rm .gitmodules
他の下位モジュールがある場合は、.gitmodules を編集して、この下位モジュール用の節を除去する必要があります:
$ vi .gitmodules
$ git add .gitmodules
次に、下位モジュールのリビジョンを、以前 下位モジュールに使用していた下位ディレクトリにインポートする必要があります。 Git はこれを下位モジュールの全ファイルの名称変更と解釈するため、diff や Gerrit のインターフェイスの出力が少しおかしくなるかもしれないことにご注意ください。
$ git read-tree --prefix=submodule/ -u remotes/origin/sandbox/username/merge-submodule
下位モジュールの .gitreview ファイルを除去するなど、必要な追加的なクリーンアップを行い、コミットします。
$ git rm submodule/.gitreview $ git commit -m "Merge submodule/name into submodule/"
Gerrit にプッシュする場合は、git review
を使用しないでください。
絶望的に混乱してしまいます。
代わりに、以下のコマンドを使用します:
$ git push gerrit HEAD:refs/for/master
この変更に伴う訂正済みパッチ セットを提出する際は、再度同じコマンドを使用する必要があります。
下位モジュールをチェックアウトした既存のローカル リポジトリでこの変更をレビューする人 (またはマージ後にこの変更をプルする人) は、新しいメイン モジュールのファイルがそれらを上書きするため、ローカルの submodule/
ディレクトリから古い下位モジュールのファイルをすべて手動で除去するように促されることにご注意ください。