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.git
: https://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根据ORIGIN
parsing相关的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