使用GIT更新子模块时出现致命错误

时间:2011-11-19 20:33:58

标签: git github ssh git-submodules

我正在尝试更新这个git repositary的子模块但是我一直遇到致命的错误:

[root@iptlock ProdigyView]# git submodule update --recursive
Cloning into core...
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
Clone of 'git@github.com:ProdigyView/ProdigyView-Core.git' into submodule path 'core' failed

或者这样

[root@iptlock root]# git clone --recursive https://github.com/ProdigyView/ProdigyView.git
Cloning into ProdigyView...
remote: Counting objects: 438, done.
remote: Compressing objects: 100% (275/275), done.
remote: Total 438 (delta 172), reused 394 (delta 128)
Receiving objects: 100% (438/438), 8.03 MiB | 5.19 MiB/s, done.
Resolving deltas: 100% (172/172), done.
Submodule 'core' (git@github.com:ProdigyView/ProdigyView-Core.git) registered for path 'core'
Cloning into core...
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
Clone of 'git@github.com:ProdigyView/ProdigyView-Core.git' into submodule path 'core' failed

为什么会发生子模块的任何想法?回购是这个:

https://github.com/ProdigyView/ProdigyView

(如果我不尝试将子模块克隆为子模块,则可以克隆子模块。)

7 个答案:

答案 0 :(得分:71)

问题是git找不到从服务器下载repo所需的公钥,解决方法是使用公共URL。

在文件.gitmodule中,您将找到以下条目:

[submodule "example"]
    path = example
    url = git@github.com:webhat/example.git

需要将URL更改为模块的公共URL:

[submodule "example"]
    path = example
    url = https://github.com/webhat/example.git

正如您所看到的,前缀 git @ 已更改为 https:// ,并且中缀变为 / < /强>

修改 在您自己的存储库中,您可能需要使用git://而不是https://

我之前的回答并不清楚,所以我补充说。

编辑2: 如果您发现需要运行git submodule sync或需要编辑.git/config才能使其生效,您可能已经为子模块设置了遥控器。

答案 1 :(得分:35)

如果它可以帮助某些人:

我更新了我的.gitmodules

[submodule "example"]
  path = example
  url = https://github.com/webhat/example.git

然后我也更新我的.git / config

[submodule "example"]
  url = https://github.com/webhat/example.git

就像你们之前说的那样(我感谢你)。

然后我更新我的.git / modules / example / config

[remote "origin"]
  fetch = [...]
  url = https://github.com/webhat/example.git

要完成我

git submodule sync
git submodule init
git submodule update

答案 2 :(得分:4)

您可以在Build - &gt;中手动传入密钥。 &#34;执行shell&#34;詹金斯工作部分:

ssh-agent bash -c 'ssh-add {path_to_private_key}; git submodule update --init --recursive'

示例:

ssh-agent bash -c 'ssh-add /var/lib/jenkins/.ssh/jenkins_rsa; git submodule update --init --recursive'

答案 3 :(得分:2)

在我的.bash_profile(在BSD sed / GNU / Mac上运行)中有一个函数,很多次我发生了这样的事情:

gitfix () {
if [ -f "./.gitmodules" ] ; then
    sed -E -i.bak -e "s/(url *= *)(.*:)(.*)/\1https:\/\/github.com\/\3/g" .gitmodules \
    git submodule sync
    git submodule update --init --recursive
fi
}

一个班轮:

sed -E -i.bak -e "s/(url *= *)(.*:)(.*)/\1https:\/\/github.com\/\3/g" .gitmodules ; git submodule sync ; git submodule update --init --recursive

vim搜索/替换:

%s/\(url\s*=\s*\)\(.*:\)\(.*\)/\1https:\/\/github.com\/\3/

基于Daniël答案的基础解决方案

答案 4 :(得分:1)

我有同样的问题。但是,在我的情况下,团队希望使用.gitmodules中的SSH访问,因此修改URL以使用http://不是一个选项。

最终,我的问题是有一个不正确的〜/ .ssh / config文件。配置文件有一些错误的设置,所以每次我真的想访问git@github.com时,我实际上都试图访问不正确的服务器。我通过执行以下命令找到了这个:

ssh -vT git@github.com

第三行应该这样说:

debug1: Connection to github.com [<ip address>] port <port num>

如果您没有尝试连接到github.com,那么您的配置文件会让您偏离正轨。

原来我无论如何都不需要配置文件中的任何内容,所以我可以安全删除它。如果你想维护一个配置文件,这里有一篇很好的文章:

http://nerderati.com/2011/03/17/simplify-your-life-with-an-ssh-config-file/

此外,这些GitHub文档确实帮助我调试了我的问题:

https://help.github.com/articles/error-permission-denied-publickey

https://help.github.com/articles/what-ip-addresses-does-github-use-that-i-should-whitelist

答案 5 :(得分:0)

添加新答案而不是进行编辑,以便所有人遇到与我以前相同的问题。

我完全相反。专用Bitbucket存储库和子模块用于工作。总是出现此错误...

fatal: repository 'http://bitbucket.org/companyname/submodule-repo-name.git' does not exist
fatal: clone of 'http://bitbucket.org/companyname/submodule-repo-name.git' into submodule path 
'/Users/me/path/to/repo-using-submodule/folder' failed
Failed to clone 'submodule/folder'. Retry scheduled
fatal: repository 'http://bitbucket.org/companyname/submodule-repo-name.git' does not exist
fatal: clone of 'http://bitbucket.org/companyname/submodule-repo-name.git' into submodule path 
'/Users/me/path/to/repo-using-submodule/folder' failed
Failed to clone 'submodule/folder' a second time, aborting

我必须手动进入.git / config文件并更新它:

[submodule "submodule-name"]
url = https://bitbucket.org/companyname/submodule-repo.git

与此:

[submodule "submodule-name"]
url = git@bitbucket.org:companyname/submodule-repo.git

不确定如何设置它,以便我和我的所有同事都可以使用该子模块而无需进行调整,但使我摆脱了几个月的苦苦挣扎。

答案 6 :(得分:-4)

想出来。 .gitmodule文件中的路径无法下载子模块。