質問:
メインリポジトリと同じ方法 (ssh または https) を使用して、git サブモジュールを自動的にチェックアウトする方法はありますか?
背景:
非公開の GitLab リポジトリ ( main
) があり、このリポジトリにはサブモジュール ( utils
) があり、これも同じサーバー上で非公開の GitLab リポジトリとしてホストされています。これらのリポジトリには、ssh または https 経由でアクセスできます。
[email protected]:my/path/repo.git
https://gitlabserver.com/my/path/repo.git
どちらのバージョンも明らかに異なる形式の認証が必要であり、クライアント コンピューターとユーザーに応じて、どちらか一方が優先されます。
トップレベルのリポジトリ ( main
) の場合、誰でも自分の好みの方法を選択できるため、これは問題になりませんが、サブモジュールの場合、これはファイルに依存するため.gitmodules
、(最初は) すべてに対して同じになります。
これで、誰もが .gitmodules ファイルを好みに合わせて調整し、それらの変更を誤ってコミットしないようにする代わりに、サーバーとリポジトリのパスを指定するだけで、git がメインのリポジトリに使用されるのと同じ方法、または gitconfig で設定できる方法を選択できると便利です。
ベストアンサー1
私は最終的にサブモジュールのURLを次のように指定することでこの問題を解決しました。相対パス:
メインの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 経由でチェックアウトした場合でも、サブモジュール ユーティリティには 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 つの異なるリモート サイトにミラーリングする場合にも便利です。