2012-11-13 62 views
10

我的回购使用Recurly-js的定制版本,并且我使用这些说明将其打包为子模块https://devcenter.heroku.com/articles/git-submodules。不过,我现在得到以下错误,当我尝试部署:Heroku推送被拒绝,子模块安装失败

----> Heroku receiving push 
-----> Git submodules detected, installing 
     Submodule 'recurly-js' (/app/tmp/repo.git/recurly-js) registered for path 'recurly-js' 
     Initialized empty Git repository in /tmp/build_3iacvn8h2rnha/recurly-js/.git/ 
     fatal: '/app/tmp/repo.git/recurly-js' does not appear to be a git repository 
     fatal: The remote end hung up unexpectedly 
     Clone of '/app/tmp/repo.git/recurly-js' into submodule path 'recurly-js' failed 
!  Heroku push rejected, Submodule install failed 

回答

15

我给出了答案,作为对@ jeffrey-k答案的评论,但是现在我更加确信它了,我会在这里写出来。

我的回购突然停止推搡,而这两样东西“固定”它:

  1. 更改所有公共子模块的URL(如果有的话)使用ssh运输网址为只读的git运输的URL(即从[email protected]:yaniv-aknin/public-projectgit://github.com/yaniv-aknin/public-project)。要做到这一点,您需要在回购的根目录中编辑名为.gitmodules的文件。
  2. 从我的回购库中删除所有私人子模块(如果有的话)(将它们从.gitmodulesrm -fr的目录中删除)。
  3. 提交更改。

此处理这些行为中的两个变化:

  1. Heroku的使用能够克隆使用ssh运输(想必他们有一些“一般的Heroku SSH密钥”和GitHub的帐户从GitHub子模块,但不确定)。
  2. Heroku过去忽略失败的子模块,只是继续推送。

我已经开了票,询问我的分析是正确的,为何发生变化(没有警告我设法听到的) - 如果我学到新的东西,我会更新这个答案。

UPDATE:Heroku的支持Noah回复了我的机票,并主要承认了我上面所说的。公共回购网址应该被更改,私人回购网站应该被移除或者根据this文档嵌入凭证;后一种解决方案具有明显的安全分歧。

+0

感谢您关注此事。 –

+0

Heroku现在似乎只接受https://变种的子模块。有关详细信息,请参阅https://devcenter.heroku.com/articles/git-submodules。 – jeffjv

1

貌似这个答案 - https://stackoverflow.com/a/8768240 - 讲述的故事。 Heroku不会接受私人回购的git子模块。我的rebly-js版本是一个分叉的非私人回购。

+0

我相信Heroku的行为有一个最近的变化。我们有一些私人和一些公共子模块的回购。直到今天,Heroku取得了公共子模块,失败后继续推进。从今天(也许是昨天)开始,Heroku似乎会在子模块失败时停止部署。另外,我们认为heroku开始将个人网址(以git @开头)作为私有网站处理回购协议,即使它们是公开的。考虑git只读URL(以git://开头)。 –