【发布时间】:2016-05-25 04:27:23
【问题描述】:
git 版本 1.7.1(我对此服务器无权)
我有一个包含多个子模块的私有仓库,其中一些也是私有的。
非私有的子模块毫无问题地进入。然而,遇到的第一个私人回购返回这个
ssh: Could not resolve hostname bitbucket.org:username: Name or service not known,进程到此停止。
As per the docs,我已经为登台服务器设置了一个部署密钥,并创建了一个 ~/.ssh/config 别名来将 bitbucket.org 指向该密钥。这是有效的,因为私人父回购很好。
登台服务器在环境中有一些我必须解决的锁定文件,所以我初始化如下:
git init
git remote add origin ssh://git@bitbucket.org/user/parent-repo.git
git fetch
git checkout -t origin/master
到目前为止一切顺利,但子模块为空:
# Update submodules
git submodule update --init --recursive
# git submodule update --remote # Not available in 1.7.1
git submodule foreach git pull origin master
## git fetch --recurse-submodules=yes # introduced 1.7.3
这是出现问题的地方,ssh 无法连接,并且进程在第一个私有 repo 时停止。访问私有存储库并不完全令人惊讶,我们需要关联另一个密钥 which cannot be the same as the one associated with the account。 (向下滚动到 Luke Woodward 这篇文章中一些有趣的 cmets 的“私人回购”标题)
因此,在创建了单个(我可以只创建一个)密钥并为每个密钥创建 ssh 别名(在登台服务器上)之后,我不知道如何正确引用这些密钥。
为了确保别名正常工作,我们 can test 他们使用:
ssh -Tv git@<alias>
成功时会返回大量以以下结尾的输出:
.... authenticated via a deploy key. You can use git or hg to connect to Bitbucket. Shell access is disabled. This deploy key has read access to the following repositories: XXXXX
这是我迄今为止尝试过的。每次更改后,我都在运行:
git submodule update --init --recursive
git submodule foreach git pull origin master
编辑:正如 cmets 重新更新链接中所建议的那样,此时 git submodule sync 将同步所有已经完成拉取的子模块。此操作中不会列出任何私人回购。很遗憾,这个操作似乎并没有解决缺少私人回购的问题。
- 将路径更改为 ssh 密钥别名
.gitmodules
结果:
ssh: Could not resolve hostname bitbucket.org:username
看起来别名正在解析,但有什么东西阻塞了密钥?
- 在
.git/config中更改ssh 密钥别名的路径。
结果:
ssh: Could not resolve hostname <alias>:username
显然别名根本没有解析。
由于选项 1 似乎至少发出了 ssh 请求,我操纵了 ssh 别名,我认为该别名将请求路由到正确的密钥。必须有一些有效的缓存,因为将别名上的主机更改为不可能的东西,例如bitbucketXXX.org。结果是同样的错误:ssh: Could not resolve hostname bitbucket.org:username。我原以为错误会读到ssh: Could not resolve hostname *bitbucketXXX.org:username* --HUMMMM
更新:经过一番思考
到目前为止,我的方法是创建一个 ssh 密钥别名,将 bitbucket.org 链接到我在个人 bitbucket 设置中为此服务器建立的父密钥。
当这对 subs 不起作用时,我为他们每个人设置了密钥,然后在服务器上为每个人设置了别名,但保持父 repo 密钥与以前相同。到目前为止,我一直在寻找在.gitmodules 和.git/config 中引用这些别名键的方法。但这根本不起作用,父键被识别,但子模块键的别名不是。
我的最后一种方法是制作一个通用密钥(与我的帐户密钥不同,他们不会让你这样做)并将其分配给父仓库,和每个子模块。在服务器上,bitbucket.org 的别名指向这个公共密钥。
现在当我在大量输出后使用ssh -Tv git@bitbucket.org 对其进行测试时,我们得到:
authenticated via a deploy key.
You can use git or hg to connect to Bitbucket. Shell access is disabled.
This deploy key has read access to the following repositories:
*A list of all the repos associated with that key*
虽然这看起来很有希望,但结果是一样的ssh: Could not resolve hostname . . .
我什至尝试过像这样将用户名吸收到别名中
Host bitbucket.org:<user_name>
HostName bitbucket.org
IdentityFile ~/.ssh/shared_bb_key
但这会导致conq: invalid repository syntax.
此时我看不到森林,更别提树木了。有什么想法吗?
【问题讨论】:
-
在使用别名更改子模块 url 后再次尝试之前,您是否像 stackoverflow.com/a/914090/6309 那样进行了 git 子模块同步?
-
这列出了已经成功的子程序,没有出错的子程序。以下
git submodule foreach git pull origin master仍然显示之前的错误。我怀疑.git/config中引用了该链接。所以那里没有快乐。 -
@vonC,我已将您的评论纳入测试。然而,它似乎并没有解决这个问题。不过,感谢您抽出宝贵时间查看此内容。
标签: git git-submodules ssh-keys