git bitbucket private submodule ssh别名问题

ori*_*ush 6 git ssh-keys git-submodules

git版本1.7.1(我对此服务器没有权力)

我有一个带有几个子模块的私人仓库,其中一些子模块也是私有的.不私有的子模块没有问题.但是遇到的第一个私有仓库会返回此状态 ssh: Could not resolve hostname bitbucket.org:username: Name or service not known,此过程将在此处停止.

根据文档,我已经为登台服务器设置了部署密钥,并创建了一个~/.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
Run Code Online (Sandbox Code Playgroud)

到目前为止很好但子模块是空的:

# 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 
Run Code Online (Sandbox Code Playgroud)

这里出了问题,ssh无法连接,进程在第一个私有仓库停止.这对于访问私人回购并不完全令人惊讶,我们需要关联另一个密钥,密钥不能与帐户关联的密钥相同.(向下滚动到'私人回购'标题,由Luke Woodward撰写本文中的一些有趣评论)

因此,在制作个人(我本来只能创建一个)密钥并为每个密钥创建ssh别名(在登台服务器上)之后,我仍然坚持如何正确引用这些密钥.

为了确保别名正常工作,我们可以用以下方法测试它们:

ssh -Tv git@<alias>
Run Code Online (Sandbox Code Playgroud)

哪个成功返回大量输出结束于:

....
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
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的内容.每次更改后,我都在运行:

git submodule update --init --recursive
git submodule foreach git pull origin master
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论中建议的那样重新更新链接,此时a git submodule sync将同步所有已经完成拉动的子模块.此操作中不会列出任何私人回购.令人遗憾的是,此操作似乎没有解决丢失私人回购的问题.

  1. 将路径更改为ssh密钥别名 .gitmodules

结果: ssh: Could not resolve hostname bitbucket.org:username

它看起来像一个别名正在解决,但有些东西阻止了关键?

  1. 将路径更改为ssh密钥别名.git/config.

结果: 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*
Run Code Online (Sandbox Code Playgroud)

虽然看起来很有希望,但结果是一样的ssh: Could not resolve hostname . . .

我甚至尝试将用户名吸收到别名中

Host bitbucket.org:<user_name>
    HostName bitbucket.org          
    IdentityFile ~/.ssh/shared_bb_key
Run Code Online (Sandbox Code Playgroud)

但这会导致 conq: invalid repository syntax.


在这一点上,我看不到森林,从不介意树木.有什么想法吗?

ori*_*ush 1

如何在存储库中使用公共和私有子模块

\n\n

我需要为使用私有子模块存储库的 WordPress 创建部署策略。互联网上已经有一些很好的资源,但它们不直接解决私有子模块。因此,我正在记录我为使用 Bitbucket 实现此功能所采取的步骤。其中一些可能也适用于其他服务,尽管我只使用 Bitbucket 进行了测试。如果您正在使用 Github,您可能也会对此答案感兴趣。

\n\n

作为前言,我一直我的临时服务器上使用 git 1.7.1,据我所知,它是在 2011 年初发布的,所以现在只有几年了。也许这使我的情况变得复杂,但如果你看到我使用command x, 而不是command Y,这可能就是原因。我试图记下我所理解的更现代的方法,并且当然会根据任何反馈进行更新。我还尝试沿途标明危险,但我不认为该问题或解决方案是我的特定主机所独有的。

\n\n

我假设您已经熟悉或已经在项目中设置了子模块。如果没有,可以从这些文章开始: \n https://www.atlassian.com/git/tutorials/
\n http://blogs.atlassian.com/2013/03/git-submodules-workflows-tips/

\n\n

对于那些已经了解的人

\n\n

如果您已经建立了密钥和别名,并且想知道为什么这不起作用请跳过。答案在于将 git 识别为 ssh 密钥别名中的用户。

\n\n

基础工作:设置 SSH 密钥

\n\n

首先,您需要能够使用终端 ssh 进入服务器,然后您需要为要拉取的模块建立一个密钥(或多个密钥)。Bitbucket 允许您在存储库之间共享 ssh 密钥,因此您的用例可能需要多个密钥。不过,为了简单起见,我将说明一种“一键统治所有”的方法。

\n\n

注意:此密钥不是在您的用户帐户中建立的用于推送到您的存储库的密钥。出于安全原因,Bitbucket 不允许您使用此密钥作为存储库上的部署密钥。

\n\n

此外,由于此过程将仅使用部署密钥,因此我们只能拉取。如果您拥有父存储库,则可以将其推回到上游,但需要该存储库的单独别名。然而,我的用例是用于测试网站的临时服务器,因此仅拉动对我来说就足够了。

\n\n

Atlassian 在此处提供了生成密钥的完整说明:https ://confluence.atlassian.com/x/YwV9E

\n\n

简而言之,密钥通常保存在~/.ssh/其中,运行时ssh-keygen将提示您完成创建密钥 \xe2\x80\x93\xe2\x80\x93 的步骤,只需记住:不要指定密码

\n\n

注意:我发现从我的目录~/.ssh运行注册机会导致稍后出现权限问题。这可能是我的服务器所特有的,但为了安全起见,只需从主目录等位置启动该过程即可。

\n\n

创建密钥后,如果您 应该能够看到它li -a ~/.ssh/。\n假设这是您保存密钥的位置,cat ~/.ssh/your_bitbucket_submod.pub将返回密钥的公共部分,因此复制此内容(注意不要添加任何额外字符),并将其粘贴到每个私有存储库的部署密钥部分。

\n\n

说明如下:https ://confluence.atlassian.com/display/BITBUCKET/Use+deployment+keys

\n\n

创建 SSH Aliise

\n\n

将密钥分配给 Bitbucket 上的存储库后,您将需要在服务器上创建 ssh 别名。每当调用 ssh 连接到这些私有存储库时,这些别名都会将公钥传递到 bitbucket.org。

\n\n

正如您可能已经猜测的那样,我们将使用 ssh,而不是 https 来进行所有私有存储库连接。

\n\n

正常的 git ssh 路径应该如下所示:ssh://git@bitbucket.org:<USER-NAME>/repo-name,尽管Bitbucket 会接受带有或不带有ssh://

\n\n

SSH 别名相对简单,在~/.ssh/config/.

\n\n

如果此配置文件存在,我们将修改它,如果不存在,我们将创建它。使用您喜欢的文本编辑器,添加以下行:

\n\n
Host your_bitbucket_submod.pub\n    HostName bitbucket.org\n    IdentityFile ~/.ssh/your_bitbucket_submod\n    User git\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是我们所需要的内容,或者至少是其中的一个主要部分。

\n\n

只是一个破败:

\n\n
    \n
  • Host是 ssh 将在发送给它的路径中查找的别名关键字。这可以是任何东西,但我经常将其命名为与生成的密钥相同的名称。

  • \n
  • HostName是别名指向的域,在本例中为 bitbucket.org。

  • \n
  • IdentityFile指向密钥的私有.pub部分(注意 no ),并且通过这两部分, ssh 可以验证会话。

  • \n
  • User指定 ssh 用户http://unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1请参阅 ENVIRONMENT

  • \n
\n\n

User?现在,这与您会发现的其他一些说明有所不同。事实证明,使用 ssh Git 将自己指定为user,并将托管存储库的 git 帐户(即您的 Bitbucket 用户名)放在分号后面。这句话让我摸不着头脑好几天,直到我重新阅读了Jochen Kupperschmidt的这篇文章,终于明白了他的意思。这是我发现的唯一一篇专门引用User此上下文中的参数的文章,因此向 Jochen 致敬。

\n\n

测试您的别名

\n\n

值得检查一下您的别名是否正在连接,以及密钥是否已分配给您期望的所有存储库。为了进行检查,请运行以下命令:

\n\n
ssh -Tv your_bitbucket_submod\n
Run Code Online (Sandbox Code Playgroud)\n\n

运气好的话,你应该会看到很多像这样结尾的废话:

\n\n
authenticated via a deploy key.\nYou can use git or hg to connect to Bitbucket. Shell access is disabled.\nThis deploy key has read access to the following repositories:\n* A list of all the repos associated with this key . . . *\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有喜悦吗?这里有一些帮助:\n https://confluence.atlassian.com/display/BITBUCKET/Troubleshoot+SSH+Issues

\n\n

设置存储库:

\n\n

现在我不是 git 专家,因此对于如何最好地完成下一部分可能会有不同的意见。我的用例是将存储库放入具有预先存在的内容的目录中,该内容不会被跟踪,但必须保留。我怀疑,随着我的上级提供反馈,这一领域将会得到一些改进。

\n\n

首先,我们将cd进入存储库所在的目录。到达那里后,我们将执行以下操作:

\n\n
git init\ngit remote add origin your_bitbucket_submod:<USER-NAME>/your-fav-repo.git\ngit fetch\ngit checkout -t origin/master\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,我们在这里使用别名因为我的父存储库也是私有的,并且我也有与其关联的部署密钥。

\n\n
\n

您可以在此处设置指向您的主帐户密钥的第二个别名。虽然我还没有对此进行测试,但这应该可以将流推送到除子模块之外的所有内容,即使它们与您的个人资料的 ssh 主密钥位于同一帐户下。

\n
\n\n

因此,如果我们走到这一步,我们的别名和密钥就可以正常工作,并且父存储库现已建立。此时您可能会想使用如下内容拉入子模块:

\n\n
# Update submodules without risk of recursion\ngit submodule update --init --recursive\n## git submodule update --remote # Not available in 1.7.1\ngit submodule foreach git pull origin master \n# git fetch --recurse-submodules=yes # introduced 1.7.3 \n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您这样做了,您应该会看到您可能拥有的任何公共子模块的成功传输,但是一旦遇到私有存储库,该过程就会停止,您可能会看到。

\n\n
\n

如果子模块中有子模块,则存在无限循环克隆的风险。这种两步更新方法应该可以防止这种情况发生

\n
\n\n
ssh: Could not resolve hostname bitbucket.org:<USER-NAME>\n
Run Code Online (Sandbox Code Playgroud)\n\n

呼?!

\n\n

或者,系统可能会提示您输入密码,在这种情况下,您的子模块已https格式化,并且需要转换为 ssh 路径。

\n\n

配置.bitbucket/config

\n\n

当你第一次检查你的父仓库时,如果 git 发现有子模块,它会创建一个隐藏文件和目录的数字来跟踪它们(ls -a以显示它们)。我们需要做的是编辑(使用 vim、nano 等)文件.git/config,并使用我们之前创建的开发密钥的别名修改此处列出的路径。

\n\n

配置文件将类似于:

\n\n
[core]\n        repositoryformatversion = 0  \n        filemode = true  \n        bare = false  \n        logallrefupdates = true  \n[remote "origin"]  \n        url = your_bitbucket_submod:<USER-NAME>/parent-repo.git  \n        fetch = +refs/heads/*:refs/remotes/origin/*  \n[branch "master"]  \n        remote = origin  \n        merge = refs/heads/master  \n[submodule "plugins/akismet"]  \n        url = https://github.com/git-mirror/wordpress-akismet.git    \n[submodule "plugins/your-famous-plugin"]\n    url = ssh://git@bitbucket.org:<USER-NAME>/your-famous-plugin.git\n    . . . \n
Run Code Online (Sandbox Code Playgroud)\n\n

[core]请注意,从您指定 时起,下面的 url已经是别名了remote add origin。随后,对于 akismet 插件,我们在 github 上看到了它通过 https 连接的公共存储库,最后在 Bitbucket 上看到了一个私有存储库。您可以在此处更改所有引用,例如:

\n\n

ssh://git@bitbucket.org:<USER-NAME>/your-famous-plugin.git

\n\n

到:your_bitbucket_submod:<USER-NAME>/your-famous-plugin.git

\n\n

完成此操作后,我们可以重新更新子模块:

\n\n
git submodule update --init --recursive\ngit submodule foreach git pull origin master \n
Run Code Online (Sandbox Code Playgroud)\n\n

看着他们滚滚而来。。。

\n\n

此时的任何失败都可能是您指定子模块时或调整配置文件时出现的某种损坏的路径。或者部署密钥实际上并未分配给 bitbucket 中的存储库。

\n\n

希望这对一些人有帮助。

\n\n

进一步阅读:

\n\n\n