git bitbucket private submodule ssh别名问题

时间:2015-03-29 15:41:16

标签: git git-submodules ssh-keys

git version 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无法连接,并且进程在第一个私有存储库上停止。对于访问私有回购,这并不奇怪,我们需要关联另一个密钥which cannot be the same as the one associated with the account。 (向下滚动到'私人回购"通过Luke Woodward向本文中的一些有趣评论前进)

因此,在制作个人(我本来只能创建一个)密钥并为每个密钥创建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

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

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

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

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

    1. .git/config中更改ssh密钥别名的路径。
    2.   

      结果: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.


      此时我无法看到森林,更别提树木了。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如何使用公共&amp;回购中的私有子模块

我需要为使用私有子模块repos的wordpress创建部署策略。关于这一点的互联网已经有一些good source,但他们并没有直接解决私人子模块。所以我记录了我用Bitbucket工作的步骤。其中一些也适用于其他服务,虽然我只用Bitbucket进行过测试。如果您正在使用Github,您可能会对n this answer too感兴趣。

只是为了序言,我stuck在我的临时服务器上使用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允许您在repos之间共享ssh密钥,因此您的用例可能需要多于一个。然而,为了简单起见,我将说明一个用于统治所有人的关键词&#39;做法。

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

此外,由于此过程仅使用部署密钥,因此我们只能使用。如果您拥有父回购,那么推回上游可能是父回购,但需要为该回购单独使用别名。我的用例是一个用于测试网站的登台服务器,因此对我来说只有拉力。

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

简而言之,密钥通常保存在~/.ssh/中,正在运行ssh-keygen会提示您完成创建密钥的步骤 - 只需记住:不要指定密码短语

注意:我发现在我的~/.ssh目录中运行的keygen会导致以后的权限问题。这可能是我的服务器所独有的,但为了安全起见,只需从您的主目录之类的某个位置启动该过程。

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

此处的说明:https://confluence.atlassian.com/display/BITBUCKET/Use+deployment+keys

创建SSH Alises

将密钥分配给Bitbucket上的repos后,您需要在服务器上创建ssh别名。只要调用ssh连接到那些私有存储库,这些别名就会将公钥提供给bitbucket.org。

正如您可能已经推测的那样,我们将使用ssh,而不是https用于我们所有的私人回购连接。

正常的git ssh路径应该如下所示:ssh://git@bitbucket.org:<USER-NAME>/repo-nameBitbucket 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指向密钥的私有部分(请注意没有.pub),并且使用这两部分,ssh可以验证会话。

  • User指定ssh用户http://unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1参见环境

User?现在,这是一个与您将要发现的其他指令不同的触摸。事实证明,使用ssh Git将自己指定为user,并在分号后放置托管repo的git帐户(即您的Bitbucket用户名)。这一行花了我head scratching的几天,直到我重新阅读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放入repo所在的目录中。在那里,我们将执行以下操作:

git init
git remote add origin your_bitbucket_submod:<USER-NAME>/your-fav-repo.git
git fetch
git checkout -t origin/master

请注意,我们在此处使用别名,因为我的父代表也是私有的,我也是与之关联的部署密钥。

  

您可以在此处设置指向主帐户密钥的第二个别名。虽然我没有对此进行测试,但这应该可以向上推送所有子模块,即使它们与您的个人资料的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 

如果您这样做,您应该会看到您可能拥有的任何公共子模块的成功转移,但只要遇到私人仓库,该过程就会停止你可能会看到。

  

如果您的子模块中有子模块,则存在无限循环克隆的风险。 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]下的网址已经是别名,从您指定remote add origin开始。稍后对于akismet插件,我们看到它在github上的公共回购通过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。

希望这有助于一些人。

进一步阅读:

答案 1 :(得分:0)

关于

ssh: Could not resolve hostname

许多人遇到的这个问题的一部分,SSH有两个不同的配置文件:系统范围的配置文件和用户特定的配置文件。我阅读的说明,包括Shannon Chou,都说要将别名添加到位于〜/ .ssh / .config的用户特定的配置文件

就我而言,我需要将别名添加到系统范围的配置文件中,在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文件中。