質問:
メインリポジトリと同じ方法(sshまたはhttps)でgitサブモジュールを自動的にチェックアウトする方法はありますか?
背景:
同じサーバー上の非公開gitlabリポジトリとしてもホストされているサブモジュール(main
)を持つ非公開gitlabリポジトリ(utils
)があります。これらのリポジトリには、sshまたはhttpsからアクセスできます。
[email protected]:my/path/repo.git
https://gitlabserver.com/my/path/repo.git
どちらのバリアントも明らかに異なる形式の認証を必要とし、クライアントコンピューターとユーザーに応じて、どちらか一方が優先されます。
最上位レベルのリポジトリ(main
)は問題ではありません。誰でも好みの方法を選択できますが、サブモジュールでは.gitmodules
ファイルであり、したがって(最初は)すべて同じです。
今では、誰もが.gitmodulesファイルを好みに合わせて変更し、誤ってそれらの変更をコミットしないようにする必要があります。サーバーとリポジトリパスを指定する方法があれば、それは素晴らしいことです。 gitは、メインリポジトリに使用されるものと同じ方法を選択するか、gitconfigで設定できる方法を選択します。
サブモジュールurlを relative path として指定することで、この問題を最終的に解決しました。
メインのgitリポジトリにアクセスできるとしましょう
https://gitlabserver.com/my/path/main.git
を介して[email protected]:my/path/main.git
経由.gitmodules
ファイルは次のようになります。
[submodule "utils"]
path = libs/utils
url = https://gitlabserver.com/my/path/utils.git
つまり、sshを介してメインアプリケーションをチェックアウトしても、サブモジュールutilsは引き続きhttpsを介してアクセスされます。
ただし、絶対パスを次のような相対パスに置き換えることができます。
[submodule "utils"]
path = libs/utils
url = ../utils.git
そしてこれから使用する
git clone --recursive https://gitlabserver.com/my/path/main.git
git clone --recursive [email protected]:my/path/main.git
希望する方法でリポジトリ構造全体を取得します。明らかに、相対sshパスとhttpsパスが同じではない場合は機能しませんが、少なくともgitlabがホストするリポジトリの場合はそうです。
これは、(何らかの理由で)2つの異なるリモートサイトでリポジトリ構造をミラーリングする場合にも便利です。