github子模块访问权(Travis CI)

无法更新git子模块。 有错误:

$ git submodule init Submodule 'build/html' (git@github.com: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. 

完整的日志: https : //travis-ci.org/quadroid/clonejs/jobs/5855553

但是当我在本地执行相同的任务时,一切正常。

通过在Travis上即时修改.gitmodules文件,可以(幸好)很容易地解决这个问题,以便在初始化子模块之前将SSH URLreplace为公用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/git@github.com:/https:\/\/github.com\//' .gitmodules - git submodule update --init --recursive 

感谢Michael Iedema从中得出了这个解决scheme的要点 。

如果你的子模块是私有的存储库,它应该工作包括在https URL的凭据,我build议做一个GitHub访问令牌有限制的权限为此目的:

 # Replace <user> and <token> with your GitHub username and access token respectively - sed -i 's/git@github.com:/https:\/\/<user>:<token>@github.com\//' .gitmodules 

我build议使用https模块的子模块,因为这将允许你拉特拉维斯和本地推: https://github.com/quadroid/clonejs.githttps://github.com/quadroid/clonejs.git

Travis现在支持使用ssh访问子模块,这是迄今为止最简单的解决scheme。 您只需将您的ssh密钥(或专用CI用户的ssh密钥)与您正在构build的Github项目相关联,如专用相关性文档中所述。

$ travis sshkey --upload ~/.ssh/id_rsa -r myorg/main

请注意,特拉维斯build议创build一个专用的用户,所以你不必使用自己的SSH密钥。

你得到这个错误是因为你通过ssh-urls指定了子模块。 对于travis-ci环境中的ssh访问,您需要configuration一个密钥 。

另外,你可以使用你的git子模块的相对URL,因为你的项目和你的子模块在Github上都是可用的。

Git根据ORIGINparsing相关的url。

例:

使用.gitmodules的前.gitmodules

 [submodule "lib/es5-shim"] path = lib/es5-shim url = git@github.com:kriskowal/es5-shim.git [submodule "build/html"] path = build/html url = git@github.com:quadroid/clonejs.git 

replace为相对url:

 [submodule "lib/es5-shim"] path = lib/es5-shim url = ../../kriskowal/es5-shim.git [submodule "build/html"] path = build/html url = ../clonejs.git 

然后当克隆 – 说 – 通过https的原点设置是这样的:

 $ 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 git@github.com:quadroid/clonejs.git $ cd clonejs $ git remote -v origin git@github.com:quadroid/clonejs.git (fetch) origin git@github.com:quadroid/clonejs.git (push) 

通过相对URL,通常的子模块序列独立于原点工作:

 $ git submodule init $ git submodule update 

你也可以直接通过git操作你的.gitmodules文件。 (受这个答案的启发)。

 git config --file=.gitmodules submodule.SUBMODULE_PATH.url https://github.com/ORG/REPO.git