1. ホーム
  2. git

[解決済み] git サブモジュールに ssh または https 経由で自動的にアクセスする。

2023-01-08 11:18:49

質問

質問です。

メインリポジトリと同じ方法(sshまたはhttps)でgitサブモジュールを自動的にチェックアウトする方法はありますか?

背景を説明します。

私たちは、非公開のgitlabリポジトリ( main ) があり、その中にサブモジュール ( utils ) があり、そのサブモジュールも同じサーバー上の非公開の gitlab リポジトリとしてホストされています。これらのリポジトリには、ssh または https でアクセスすることができます。

両方のバリエーションは明らかに異なる形式の認証を必要とし、クライアントコンピュータとユーザーによって、どちらかが好まれます。

トップレベルのリポジトリに対して ( main ) では、誰でも好きな方法を選択できるので問題ありませんが、サブモジュールでは、これは .gitmodules ファイルに依存するため、(初期状態では) すべて同じになります。

今、誰もが .gitmodules ファイルを自分の好みに合わせて、誤って変更をコミットしないようにしなければならない代わりに、サーバーとレポのパスを指定するだけでgitがメインレポに使用するのと同じ方法を選択するか、gitconfigで設定できる方法があるとよいでしょう。

どのように解決するのですか?

私は最終的にこの問題を、サブモジュールの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でチェックアウトしても、サブモジュールの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つの異なるリモートサイトでリポジトリ構造をミラーリングしている場合にも便利です。