web-dev-qa-db-ja.com

Gitサブモジュールとsshアクセス

いくつかのサブモジュールを含むgitリポジトリに問題があります。

スーパーgitリポジトリは、次のコマンドで構築されました

mkdir projectname
cd projectname
git init
git submodule add ssh://myusername@server/pathtorepos

別のユーザー( "otheruser")がスーパーリポジトリのクローンを作成すると、すべてうまくいくようです。しかし、サブモジュールにアクセスするときが来たとき

git submodule init
git submodule update

gitは、「otheruser」の代わりに「myusername」を使用してサブモジュールのクローンを作成しようとします。

この問題を解決するには?

41
midtiby

可能であれば、.gitmodulesファイルに、誰でも複製できるリポジトリのURL、通常はgit://またはhttp:// URLが含まれていることを確認するのが最善です。次に、SSHアクセス権を持っているユーザーは、複製後にサブモジュールに変更し、remote.Origin.urlのURLを変更して、ユーザー名でSSH URLを指すようにします。例:

 cd my-submodule
 git remote set-url Origin otheruser@server:/pathtorepos

他のユーザーは、現在の状況でもそれを行うことができるはずです。 更新:クリス・ジョンセンは、ユーザー名を省略し、リポジトリのすべてのユーザーがSSHアクセスを持っている場合、.gitmodulesでSSH URLを使用することも合理的であることを以下に指摘します。ローカルとリモートで異なる場合、上記と同様にユーザー名を追加します。

.gitmodulesのURLは、サブモジュールをinitializingする場合にのみ使用されることに注意してください。サブモジュールを初期化すると、メインプロジェクトの構成値submodule.<SUBMODULE-NAME>.url.gitmodulesでコミットされたものに設定されます。これは、最初のサブモジュールの更新で使用される値です。サブモジュールの初期化と更新の間で、次のようなコマンドで最初の更新に使用されるこのURLを変更することもできます。

git config submodule.my-submodule.url otheruser@server:/pathtorepos

実際、最初の更新が失敗した場合、これを行う必要があります。サブモジュールが初めて更新されると、変更する必要があるURLは、サブモジュール内のOriginに定義されているURLです。その時点では、メインのsubmodule.my-submodule.url構成値を設定するだけですサブモジュールを削除して再更新する可能性が高い場合は、project。

40
Mark Longair

他のユーザーは、.git/configファイルを変更して、ユーザー名を自分のユーザー名に変更する必要があります。このようにして、gitは適切なユーザーを使用してサーバーに接続します。

[submodule "path/to/module"]
    url = ssh://otheruser@server/pathtorepos
11
Ikke

オープンソースプロジェクトでこれに対処するには、.gitmodulesファイルに相対URLを入力します。これにより、gitは親プロジェクトのURLパターンによって複製されるURLに基​​づいてサブモジュールURLを複製します。相対パスを使用すると、プロトコル(https、ssh)とユーザー名を完全に指定する必要がなくなります。

[submodule "my/tests/schemas"]
    path = my/tests/schemas
    url = ../my-schema

追伸投稿した後、私は私の答えがだまされていることに気付きました、ここにあなたが使用すべきソースがあります: sshまたはhttps経由でサブモジュールに自動的にアクセスする

4
chrisinmtown

参考までに、私が使用したソリューションは次のとおりです。実際、他の人が既存のリポジトリをチェックアウトすることは可能です。

リポジトリをチェックアウトする必要があるときは、コマンドで実行できます

git clone ssh://[email protected]/path/to/superrepos
cd superrepos
git submodule init
git submodule update

他の人がスーパーリポジトリをチェックアウトするには、次のコマンドセットが使用されます。唯一の違いは、他のリポジトリの手動クローニングです

git clone ssh://[email protected]/path/to/superrepos
cd superrepos
git clone ssh://[email protected]/path/to/other/repos
git submodule init
git submodule update

を発行した後に注意してください

git submodule init

コマンドを実行すると、gitは要求されたリポジトリと利用可能なリポジトリが同一ではないことを通知します。しかし、これは致命的ではなく、安全に続行できます。

2
midtiby

ユーザー名をURLに含めないでください。 gitはclone/pull/etcのときにユーザー名とパスワードの入力を求めます

0
yano