web-dev-qa-db-ja.com

sshまたはhttpsを介してgitサブモジュールに自動的にアクセスする

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

背景:

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

どちらのバリアントも明らかに異なる形式の認証を必要とし、クライアントコンピューターとユーザーに応じて、どちらか一方が優先されます。

最上位レベルのリポジトリ(main)は問題ではありません。誰でも好みの方法を選択できますが、サブモジュールでは.gitmodulesファイルであり、したがって(最初は)すべて同じです。
今では、誰もが.gitmodulesファイルを好みに合わせて変更し、誤ってそれらの変更をコミットしないようにする必要があります。サーバーとリポジトリパスを指定する方法があれば、それは素晴らしいことです。 gitは、メインリポジトリに使用されるものと同じ方法を選択するか、gitconfigで設定できる方法を選択します。

34
MikeMB

サブモジュール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つの異なるリモートサイトでリポジトリ構造をミラーリングする場合にも便利です。

47
MikeMB