エラーでgitサブモジュールを更新できません:
$ git submodule init
Submodule 'build/html' ([email protected]:quadroid/clonejs.git) registered for path 'build/html'
...
$ git submodule update
Cloning into 'build/html'...
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
しかし、ローカルで同じタスクを実行すると、すべてが大丈夫です。
Travis CIビルドがパスし、リポジトリ内のサブモジュールをクリックしてそこに直接アクセスできるように、これを修正するにはどうすればよいですか?
これは(ありがたいことに)Travisでオンザフライで.gitmodulesファイルを変更することで簡単に解決でき、サブモジュールを初期化する前にSSH URLがパブリックURLに置き換えられます。これを行うには、以下を.travis.ymlに追加します。
# Handle git submodules yourself
git:
submodules: false
# Use sed to replace the SSH URL with the public URL, then initialize submodules
before_install:
- sed -i 's/[email protected]:/https:\/\/github.com\//' .gitmodules
- git submodule update --init --recursive
Gist を提供してくれたMichael Iedemaに感謝します。
サブモジュールがプライベートリポジトリである場合、https URLに認証情報を含めるように機能するはずです。この目的のために、制限された権限で GitHubアクセストークン を作成することをお勧めします。
# Replace <user> and <token> with your GitHub username and access token respectively
- sed -i 's/[email protected]:/https:\/\/<user>:<token>@github.com\//' .gitmodules
TravisとPullをローカルでプルできるようにするため、サブモジュールにはhttps
スキームを使用することをお勧めします:https://github.com/quadroid/clonejs.git
。
Travisは、sshを使用したサブモジュールへのアクセスをサポートするようになりました。これは、最も簡単なソリューションです。 プライベート依存関係のドキュメント で説明されているように、sshキー(または専用CIユーザーのsshキー)を作成中のGithubプロジェクトに関連付けるだけです。
$ travis sshkey --upload ~/.ssh/id_rsa -r myorg/main
Travisでは、独自のsshキーを使用する必要がないように、専用のユーザーを作成することをお勧めしています。
このエラーは、ssh-urlsを介してサブモジュールを指定したために発生します。 travis-ci環境からsshアクセスするには、 キーの構成 を行う必要があります。
または、プロジェクトとサブモジュールはすべてGithubで利用できるため、gitサブモジュールに相対URLを使用することもできます。
GitはOrigin
に対して相対URLを解決します。
例:
.gitmodules
の最初の2つのエントリを使用:
[submodule "lib/es5-shim"]
path = lib/es5-shim
url = [email protected]:kriskowal/es5-shim.git
[submodule "build/html"]
path = build/html
url = [email protected]:quadroid/clonejs.git
相対URLに置き換え:
[submodule "lib/es5-shim"]
path = lib/es5-shim
url = ../../kriskowal/es5-shim.git
[submodule "build/html"]
path = build/html
url = ../clonejs.git
次に、複製するとき-たとえば-httpsを介してOriginは次のように設定されます。
$ git clone https://github.com/quadroid/clonejs.git
$ cd clonejs
$ git remote -v
Origin https://github.com/quadroid/clonejs.git (fetch)
Origin https://github.com/quadroid/clonejs.git (Push)
Ssh経由で複製する場合:
$ git clone [email protected]:quadroid/clonejs.git
$ cd clonejs
$ git remote -v
Origin [email protected]:quadroid/clonejs.git (fetch)
Origin [email protected]:quadroid/clonejs.git (Push)
相対URLでは、通常のサブモジュールシーケンスはOriginとは無関係に機能します。
$ git submodule init
$ git submodule update
git
を使用して.gitmodulesファイルを直接操作することもできます。 ( この答え に触発されました)。
git config --file=.gitmodules submodule.SUBMODULE_PATH.url https://github.com/ORG/REPO.git