git bitbucket 私有子模块 ssh 别名问题
git bitbucket private submodule ssh alias issues
git 版本 1.7.1(我对此服务器无能为力)
我有一个包含多个子模块的私有仓库,其中一些也是私有的。
非私有的子模块可以毫无问题地进入。然而,第一个私人仓库遇到了 returns 这个
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 无法连接,进程在第一个私有存储库上停止。这对于访问私人仓库并不奇怪,我们需要关联另一个密钥,which cannot be the same as the one associated with the account. (scroll down to 'Private repos" heading for some interesting comments in this article by Luke Woodward)
因此,在制作了单独的(我本可以只创建一个)密钥并为每个密钥(在登台服务器上)创建 ssh 别名之后,我对如何正确引用这些密钥感到困惑。
为了确保别名正常工作,我们 can test 他们使用:
ssh -Tv git@<alias>
成功时 returns 大量输出以:
结尾
....
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
这是我到目前为止所尝试过的方法。每次更改后,Im 运行:
git submodule update --init --recursive
git submodule foreach git pull origin master
编辑:正如评论中建议的重新更新链接,此时 git submodule sync
将同步所有已经完成拉动的子模块。 None 个私人仓库将在此操作中列出。很遗憾,此操作似乎无法解决缺少私有存储库的问题。
- 更改 ssh 密钥别名的路径
.gitmodules
Result: ssh: Could not resolve hostname bitbucket.org:username
看起来别名正在解析,但有东西挡住了密钥?
- 在
.git/config
中更改 ssh 密钥别名的路径。
Result: 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.
此时我看不到森林,更不用说树木了。有什么想法吗?
如何在 repo
中使用 public 和私有子模块
我需要为使用私有子模块存储库的 wordpress 创建部署策略。有一些good source out in the interwebs on this already, but they don't directly address private submodules. So I'm documenting the steps I took to make this work with Bitbucket. Some of this may apply to other services as well, though I've only been tested it with Bitbucket. If you're using Github, you might be interested in this answer too。
作为序言,我 stuck using git 1.7.1 在我的暂存服务器上,据我所知它是在 2011 年初发布的,所以只有 几 岁现在。也许这使我的情况变得复杂,但如果您看到我使用 command x
而不是 command Y
,这可能就是原因。我试图记录下我所理解的更现代的方法,并且当然会根据任何反馈进行更新。我也尝试在整个过程中标示危险,但我不认为该问题或解决方案是我的特定主机独有的。
我假设您已经熟悉或已经在您的项目中设置了子模块。如果不是,可以从这些文章开始:
https://www.atlassian.com/git/tutorials/
http://blogs.atlassian.com/2013/03/git-submodules-workflows-tips/
对于那些已经知道的人
如果您已经建立了密钥和别名,并且想知道为什么这 不能正常工作 ,请直接跳过。答案在于将 git 识别为您的 ssh 密钥别名中的用户。
基础工作:设置 SSH 密钥
首先,您需要能够使用终端通过 ssh 连接到您的服务器,然后您需要为要拉取的模块建立一个(或多个)密钥。 Bitbucket 允许您在存储库之间共享 ssh 密钥,因此您的用例可能需要多个。但是,为简单起见,我将说明一种 'one key to rule them all' 方法。
注意:此密钥不是在您的用户帐户中建立的允许您推送到您的存储库的密钥。出于安全原因,Bitbucket 不允许您将此密钥用作存储库上的部署密钥。
此外,由于此过程将仅使用部署密钥,因此我们只能拉取。如果您拥有父仓库,则可以将其推回上游,但该仓库需要一个单独的别名。然而,我的用例是用于测试网站的临时服务器,因此仅拉动对我来说已经足够了。
Atlassian 在此处提供了生成密钥的完整说明:https://confluence.atlassian.com/x/YwV9E
简而言之,密钥通常保存在~/.ssh/
中,运行宁ssh-keygen
会提示您完成创建密钥的步骤–– 请记住:不要指定密码。
注意:我发现 运行 在 中 我的 ~/.ssh
目录中使用 keygen 导致权限问题之后。这可能是我的服务器独有的,但为了安全起见,只需从您的主目录之类的地方启动该过程。
创建密钥后,如果 li -a ~/.ssh/
,您应该能够看到它。
假设这是你保存密钥的地方,cat ~/.ssh/your_bitbucket_submod.pub
将 return 密钥的 public 部分,所以复制它(注意不要添加任何额外的字符),并将其粘贴到每个私人仓库的部署密钥部分。
此处说明:https://confluence.atlassian.com/display/BITBUCKET/Use+deployment+keys
创建 SSH Alises
将密钥分配给 Bitbucket 上的存储库后,您需要在服务器上创建 ssh 别名。每当调用 ssh 连接到那些私有存储库时,这些别名会将 public 密钥传送到 bitbucket.org。
您可能已经猜到,我们将使用 ssh,而不是 https 来进行我们所有的私有存储库连接。
正常 git ssh 路径应如下所示:ssh://git@bitbucket.org:<USER-NAME>/repo-name
,尽管 Bitbucket will accept the path with or without ssh://
SSH 别名相对简单,在 ~/.ssh/config/
中指定。
如果此配置文件存在,我们将修改它,如果不存在,我们将创建它。使用您喜欢的文本编辑器,添加以下行:
Host your_bitbucket_submod.pub
HostName bitbucket.org
IdentityFile ~/.ssh/your_bitbucket_submod
User git
这是我们需要的内容,或者至少是其中的一个主要部分。
只需 运行 下来:
Host
是 ssh 将在发送给它的路径中寻找的别名关键字。这可以是任何东西,但我经常将其命名为与生成的密钥相同的名称。
HostName
是别名指向的域,在本例中为 bitbucket.org.
IdentityFile
指向您的密钥的 private 部分(注意没有 .pub
),对于这两部分,ssh 可以验证会话。
User
指定 ssh 用户 http://unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 参见 ENVIRONMENT
User
?现在,这与您会发现的其他一些说明略有不同。事实证明,使用 ssh Git 将自己指定为 user, and places the git account hosting the repo (ie your Bitbucket user name) after the semicolon. This one line cost me a few days of , until I re-read this article by Jochen Kupperschmidt 并最终理解了他的意思。这是我发现的唯一一篇在此上下文中专门引用 User
参数的文章,所以向 Jochen 致敬。
正在测试您的别名
值得检查一下您的别名是否正在连接,以及密钥是否已分配给您期望的所有存储库。为了检查,运行 以下内容:
ssh -Tv your_bitbucket_submod
运气好的话,你应该会看到很多像这样结尾的废话:
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 this key . . . *
没有快乐?这里有一些帮助:
https://confluence.atlassian.com/display/BITBUCKET/Troubleshoot+SSH+Issues
设置存储库:
现在我不是 git 的高手,所以对于如何最好地完成下一部分可能会有不同的意见。我的用例是将 repo 放入一个目录中,该目录具有不会被跟踪的预先存在的内容,but must remain。我怀疑这是一个需要改进的领域,因为我的更好的人会提供反馈。
首先,我们将 cd
进入存储库所在的目录。到达那里后,我们将执行以下操作:
git init
git remote add origin your_bitbucket_submod:<USER-NAME>/your-fav-repo.git
git fetch
git checkout -t origin/master
请注意,我们在这里使用 别名,因为我的父存储库也是私有的,并且我也有与之关联的部署密钥。
您可以在此处设置指向您的主帐户密钥的第二个别名。虽然我没有对此进行测试,但这应该能够向上推送所有 but 子模块,即使它们与您的配置文件的 ssh 主密钥位于同一帐户下。
所以,如果我们做到了这一点,我们的别名和密钥就可以使用了,父存储库现在已经建立。此时您可能会想使用类似以下内容的子模块:
# Update submodules without risk of recursion
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
如果这样做,您应该会看到您可能拥有的任何 public 子模块的成功传输,但是一旦 private repo 时,进程会停止,您可能会看到。
如果您的子模块中有子模块,则存在克隆无限循环的风险。 This two step method of updating should prevent this.
ssh: Could not resolve hostname bitbucket.org:<USER-NAME>
呼?!
或者,系统可能会提示您输入密码,在这种情况下,您的子模块是 https
格式,需要转换为 ssh 路径。
正在设置 .bitbucket/config
:
当你第一次检查你的父仓库时,如果 git 发现有子模块,它会创建一个数字来跟踪它们(ls -a
以显示它们)。我们需要做的是编辑(使用 vim、nano 等).git/config
文件,并使用我们之前创建的开发密钥的别名修改此处列出的路径。
配置文件类似于:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = your_bitbucket_submod:<USER-NAME>/parent-repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[submodule "plugins/akismet"]
url = https://github.com/git-mirror/wordpress-akismet.git
[submodule "plugins/your-famous-plugin"]
url = ssh://git@bitbucket.org:<USER-NAME>/your-famous-plugin.git
. . .
请注意,[core]
下的 url 已经是别名,从您指定 remote add origin
开始。稍后对于 akismet 插件,我们在 github 上看到它的 public 回购通过 https 连接,最后在 Bitbucket 上看到一个私人回购。在这里您将更改所有引用,例如:
ssh://git@bitbucket.org:<USER-NAME>/your-famous-plugin.git
至:your_bitbucket_submod:<USER-NAME>/your-famous-plugin.git
完成后我们可以重新更新子模块:
git submodule update --init --recursive
git submodule foreach git pull origin master
看着他们滚滚而来。 . .
此时的任何失败都可能是您指定子模块时或调整配置文件时出现的某种损坏的路径。或者部署密钥实际上并未分配给 bitbucket 中的 repo。
希望这对一些人有帮助。
进一步阅读:
关于
ssh: Could not resolve hostname
作为许多人遇到的这个问题的一部分,SSH 有两个不同的配置文件:系统范围的配置文件和用户特定的配置文件。我阅读的说明,包括 Shannon Chou 的,都说要将别名添加到位于 ~/.ssh/.config
的 user-specific 配置文件中
在我的例子中,我需要将别名添加到 系统范围 配置文件中,在 Windows 10 上使用 Git 通常是位于:C:\Program Files\Git\etc\ssh\ssh_config,在 Git 的目录中。
您可以通过运行此命令确定SSH正在使用哪个配置文件,"myalias"可以是任何字符串我们感兴趣的是这将输出的配置文件路径:
ssh -vv myalias
OpenSSH_7.1p2, OpenSSL 1.0.2d 9 Jul 2015
debug1: Reading configuration data /etc/ssh/ssh_config
在输出中注意文件路径,“/etc/ssh/ssh_config”。这告诉我们 SSH 正在寻找别名,而不是在 ~/.ssh/.config 文件中。
git 版本 1.7.1(我对此服务器无能为力)
我有一个包含多个子模块的私有仓库,其中一些也是私有的。
非私有的子模块可以毫无问题地进入。然而,第一个私人仓库遇到了 returns 这个
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 无法连接,进程在第一个私有存储库上停止。这对于访问私人仓库并不奇怪,我们需要关联另一个密钥,which cannot be the same as the one associated with the account. (scroll down to 'Private repos" heading for some interesting comments in this article by Luke Woodward)
因此,在制作了单独的(我本可以只创建一个)密钥并为每个密钥(在登台服务器上)创建 ssh 别名之后,我对如何正确引用这些密钥感到困惑。
为了确保别名正常工作,我们 can test 他们使用:
ssh -Tv git@<alias>
成功时 returns 大量输出以:
结尾.... 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
这是我到目前为止所尝试过的方法。每次更改后,Im 运行:
git submodule update --init --recursive
git submodule foreach git pull origin master
编辑:正如评论中建议的重新更新链接,此时 git submodule sync
将同步所有已经完成拉动的子模块。 None 个私人仓库将在此操作中列出。很遗憾,此操作似乎无法解决缺少私有存储库的问题。
- 更改 ssh 密钥别名的路径
.gitmodules
Result:
ssh: Could not resolve hostname bitbucket.org:username
看起来别名正在解析,但有东西挡住了密钥?
- 在
.git/config
中更改 ssh 密钥别名的路径。
Result:
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.
此时我看不到森林,更不用说树木了。有什么想法吗?
如何在 repo
中使用 public 和私有子模块我需要为使用私有子模块存储库的 wordpress 创建部署策略。有一些good source out in the interwebs on this already, but they don't directly address private submodules. So I'm documenting the steps I took to make this work with Bitbucket. Some of this may apply to other services as well, though I've only been tested it with Bitbucket. If you're using Github, you might be interested in this answer too。
作为序言,我 stuck using git 1.7.1 在我的暂存服务器上,据我所知它是在 2011 年初发布的,所以只有 几 岁现在。也许这使我的情况变得复杂,但如果您看到我使用 command x
而不是 command Y
,这可能就是原因。我试图记录下我所理解的更现代的方法,并且当然会根据任何反馈进行更新。我也尝试在整个过程中标示危险,但我不认为该问题或解决方案是我的特定主机独有的。
我假设您已经熟悉或已经在您的项目中设置了子模块。如果不是,可以从这些文章开始:
https://www.atlassian.com/git/tutorials/
http://blogs.atlassian.com/2013/03/git-submodules-workflows-tips/
对于那些已经知道的人
如果您已经建立了密钥和别名,并且想知道为什么这 不能正常工作 ,请直接跳过。答案在于将 git 识别为您的 ssh 密钥别名中的用户。
基础工作:设置 SSH 密钥
首先,您需要能够使用终端通过 ssh 连接到您的服务器,然后您需要为要拉取的模块建立一个(或多个)密钥。 Bitbucket 允许您在存储库之间共享 ssh 密钥,因此您的用例可能需要多个。但是,为简单起见,我将说明一种 'one key to rule them all' 方法。
注意:此密钥不是在您的用户帐户中建立的允许您推送到您的存储库的密钥。出于安全原因,Bitbucket 不允许您将此密钥用作存储库上的部署密钥。
此外,由于此过程将仅使用部署密钥,因此我们只能拉取。如果您拥有父仓库,则可以将其推回上游,但该仓库需要一个单独的别名。然而,我的用例是用于测试网站的临时服务器,因此仅拉动对我来说已经足够了。
Atlassian 在此处提供了生成密钥的完整说明:https://confluence.atlassian.com/x/YwV9E
简而言之,密钥通常保存在~/.ssh/
中,运行宁ssh-keygen
会提示您完成创建密钥的步骤–– 请记住:不要指定密码。
注意:我发现 运行 在 中 我的 ~/.ssh
目录中使用 keygen 导致权限问题之后。这可能是我的服务器独有的,但为了安全起见,只需从您的主目录之类的地方启动该过程。
创建密钥后,如果 li -a ~/.ssh/
,您应该能够看到它。
假设这是你保存密钥的地方,cat ~/.ssh/your_bitbucket_submod.pub
将 return 密钥的 public 部分,所以复制它(注意不要添加任何额外的字符),并将其粘贴到每个私人仓库的部署密钥部分。
此处说明:https://confluence.atlassian.com/display/BITBUCKET/Use+deployment+keys
创建 SSH Alises
将密钥分配给 Bitbucket 上的存储库后,您需要在服务器上创建 ssh 别名。每当调用 ssh 连接到那些私有存储库时,这些别名会将 public 密钥传送到 bitbucket.org。
您可能已经猜到,我们将使用 ssh,而不是 https 来进行我们所有的私有存储库连接。
正常 git ssh 路径应如下所示:ssh://git@bitbucket.org:<USER-NAME>/repo-name
,尽管 Bitbucket will accept the path with or without ssh://
SSH 别名相对简单,在 ~/.ssh/config/
中指定。
如果此配置文件存在,我们将修改它,如果不存在,我们将创建它。使用您喜欢的文本编辑器,添加以下行:
Host your_bitbucket_submod.pub
HostName bitbucket.org
IdentityFile ~/.ssh/your_bitbucket_submod
User git
这是我们需要的内容,或者至少是其中的一个主要部分。
只需 运行 下来:
Host
是 ssh 将在发送给它的路径中寻找的别名关键字。这可以是任何东西,但我经常将其命名为与生成的密钥相同的名称。HostName
是别名指向的域,在本例中为 bitbucket.org.IdentityFile
指向您的密钥的 private 部分(注意没有.pub
),对于这两部分,ssh 可以验证会话。User
指定 ssh 用户 http://unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 参见 ENVIRONMENT
User
?现在,这与您会发现的其他一些说明略有不同。事实证明,使用 ssh Git 将自己指定为 user, and places the git account hosting the repo (ie your Bitbucket user name) after the semicolon. This one line cost me a few days of User
参数的文章,所以向 Jochen 致敬。
正在测试您的别名
值得检查一下您的别名是否正在连接,以及密钥是否已分配给您期望的所有存储库。为了检查,运行 以下内容:
ssh -Tv your_bitbucket_submod
运气好的话,你应该会看到很多像这样结尾的废话:
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 this key . . . *
没有快乐?这里有一些帮助: https://confluence.atlassian.com/display/BITBUCKET/Troubleshoot+SSH+Issues
设置存储库:
现在我不是 git 的高手,所以对于如何最好地完成下一部分可能会有不同的意见。我的用例是将 repo 放入一个目录中,该目录具有不会被跟踪的预先存在的内容,but must remain。我怀疑这是一个需要改进的领域,因为我的更好的人会提供反馈。
首先,我们将 cd
进入存储库所在的目录。到达那里后,我们将执行以下操作:
git init
git remote add origin your_bitbucket_submod:<USER-NAME>/your-fav-repo.git
git fetch
git checkout -t origin/master
请注意,我们在这里使用 别名,因为我的父存储库也是私有的,并且我也有与之关联的部署密钥。
您可以在此处设置指向您的主帐户密钥的第二个别名。虽然我没有对此进行测试,但这应该能够向上推送所有 but 子模块,即使它们与您的配置文件的 ssh 主密钥位于同一帐户下。
所以,如果我们做到了这一点,我们的别名和密钥就可以使用了,父存储库现在已经建立。此时您可能会想使用类似以下内容的子模块:
# Update submodules without risk of recursion
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
如果这样做,您应该会看到您可能拥有的任何 public 子模块的成功传输,但是一旦 private repo 时,进程会停止,您可能会看到。
如果您的子模块中有子模块,则存在克隆无限循环的风险。 This two step method of updating should prevent this.
ssh: Could not resolve hostname bitbucket.org:<USER-NAME>
呼?!
或者,系统可能会提示您输入密码,在这种情况下,您的子模块是 https
格式,需要转换为 ssh 路径。
正在设置 .bitbucket/config
:
当你第一次检查你的父仓库时,如果 git 发现有子模块,它会创建一个数字来跟踪它们(ls -a
以显示它们)。我们需要做的是编辑(使用 vim、nano 等).git/config
文件,并使用我们之前创建的开发密钥的别名修改此处列出的路径。
配置文件类似于:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = your_bitbucket_submod:<USER-NAME>/parent-repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[submodule "plugins/akismet"]
url = https://github.com/git-mirror/wordpress-akismet.git
[submodule "plugins/your-famous-plugin"]
url = ssh://git@bitbucket.org:<USER-NAME>/your-famous-plugin.git
. . .
请注意,[core]
下的 url 已经是别名,从您指定 remote add origin
开始。稍后对于 akismet 插件,我们在 github 上看到它的 public 回购通过 https 连接,最后在 Bitbucket 上看到一个私人回购。在这里您将更改所有引用,例如:
ssh://git@bitbucket.org:<USER-NAME>/your-famous-plugin.git
至:your_bitbucket_submod:<USER-NAME>/your-famous-plugin.git
完成后我们可以重新更新子模块:
git submodule update --init --recursive
git submodule foreach git pull origin master
看着他们滚滚而来。 . .
此时的任何失败都可能是您指定子模块时或调整配置文件时出现的某种损坏的路径。或者部署密钥实际上并未分配给 bitbucket 中的 repo。
希望这对一些人有帮助。
进一步阅读:
关于
ssh: Could not resolve hostname
作为许多人遇到的这个问题的一部分,SSH 有两个不同的配置文件:系统范围的配置文件和用户特定的配置文件。我阅读的说明,包括 Shannon Chou 的,都说要将别名添加到位于 ~/.ssh/.config
的 user-specific 配置文件中在我的例子中,我需要将别名添加到 系统范围 配置文件中,在 Windows 10 上使用 Git 通常是位于:C:\Program Files\Git\etc\ssh\ssh_config,在 Git 的目录中。
您可以通过运行此命令确定SSH正在使用哪个配置文件,"myalias"可以是任何字符串我们感兴趣的是这将输出的配置文件路径:
ssh -vv myalias
OpenSSH_7.1p2, OpenSSL 1.0.2d 9 Jul 2015
debug1: Reading configuration data /etc/ssh/ssh_config
在输出中注意文件路径,“/etc/ssh/ssh_config”。这告诉我们 SSH 正在寻找别名,而不是在 ~/.ssh/.config 文件中。