如何指定在git中使用哪个SSH密钥进行git push以获得作为镜像的gitorious?

我有一个在git.debian.org(alioth)上托pipe的项目,我想configuration一个post-receive钩子来更新http://gitorious.org上的资源库镜像

我想我将不得不使用git push --mirror gitorious

现在,我需要让Alioth获得成功的推动。 我怎么做?

我想我需要在gitorious上configuration一个用户,并为其创build一个ssh密钥。 然后,当我在后接收挂钩的git推,确保使用这个SSH密钥。

我可以使用~/.ssh/config但是问题是很多用户可能会推迟,每个人都必须login并configuration~/.ssh/config 。 相反,我想有一个命令行选项或环境variables告诉ssh哪个键使用。 我可以这样做吗?

另外,你有其他的想法可以实现镜像吗? 而且,是否有可能以相反的方式进行configuration(对alioth有强烈的推动力)?

答案可以在git参考手册中find 。

GIT_SSH

如果设置了这个环境variables,那么git fetch和git push会在需要连接远程系统时使用这个命令而不是ssh。 $GIT_SSH命令将只有两个参数:URL中的用户名@主机(或主机)和要在该远程系统上执行的shell命令。

要将选项传递给您想要在GIT_SSH列出的程序,您需要将程序和选项包装到shell脚本中,然后将GIT_SSH设置为引用shell脚本。

通常,通过个人的.ssh/config文件configuration任何所需的选项更为简单。 请查阅您的ssh文档以获取更多详细信息。

所以,我需要编写一个包装脚本,我写这个push-gitorious.sh脚本:

 #!/bin/sh if [ "run" != "$1" ]; then exec ssh -i "$GITORIOUS_IDENTITY_FILE" -o "StrictHostKeyChecking no" "$@" fi remote=YOUR_SSH_GITORIOUS_URL echo "Mirroring to $remote" export GITORIOUS_IDENTITY_FILE="`mktemp /tmp/tmp.XXXXXXXXXX`" export GIT_SSH="$0" cat >"$GITORIOUS_IDENTITY_FILE" <<EOF YOUR SSH PRIVATE KEY EOF cat >"$GITORIOUS_IDENTITY_FILE.pub" <<EOF YOUR SSH PUBLIC KEY EOF #echo git push --mirror "$remote" git push --mirror "$remote" rm -f "$GITORIOUS_IDENTITY_FILE" rm -f "$GITORIOUS_IDENTITY_FILE.pub" exit 0 

当然,你必须填写私钥(公钥包含在脚本中仅供参考,也需要填写有价值的URL。

在接收后的钩子,你必须把:

 path/to/push-gitorious.sh run 

运行选项很重要,否则会直接运行ssh。

警告:不检查远程主机身份。 您可以从ssh命令行中删除该选项,并根据需要自定义known_hosts 。 在这个用例中,我不认为这很重要。

这是我知道的两种方法,以便您可以在git命令行中指定要用于git站点的任何密钥文件。 您不需要在configuration文件或脚本中对此密钥文件进行硬编码。 你只需在git命令行提供这个直线。

方法1:使用GIT_SSH环境variables

在命令行中的用法如下所示:

 $ PKEY=~/.ssh/keyfile.pem git clone git@github.com:me/repo.git 

要使用这个命令,你需要做一些预先设置。 首先,创build一个包含以下内容的shell脚本:

 #!/bin/sh if [ -z "$PKEY" ]; then # if PKEY is not specified, run ssh using default keyfile ssh "$@" else ssh -i "$PKEY" "$@" fi 

接下来,导出并设置GIT_SSHvariables,其值等于上面的shell脚本的位置。

 $ export GIT_SSH=~/ssh-git.sh 

其中〜/ ssh-git.sh是上面的shell脚本的文件名。

该脚本必须是可执行的,所以做一个chmod:

 $ chmod +x ~/ssh-git.sh 

现在,您可以使用您select使用的任何密钥文件运行此命令:

 $ PKEY=~/.ssh/keyfile1.pem git clone git@github.com:me/repo.git 

要为其他主机使用另一个密钥文件

 $ PKEY=~/.ssh/keyfile2.pem git clone git@myothersite.com:other/repo.git 

这支持你想要使用的任何密钥文件。 每次你需要使用你想要使用的密钥文件来运行git,只要把它提供给PKEYvariables。 只要GIT_SSH已经被预先configuration,你可以忘记其他的一切。

记下PKEYvariables。 您可以使用任何名称,只要它与GIT_SSH指向的shell脚本中使用的名称相匹配即可。

方法2:使用包装脚本

包装脚本的用法是这样的:

 $ git.sh -i ~/.ssh/keyfile.pem clone git@github.com:me/repo.git 

这个用法很直观,因为它看起来像使用-i选项运行ssh。

这不需要预先设置shell脚本和GIT_SSH。 你只需要用git命令下载并运行这个包装器脚本。

你可以在这里得到这个包装脚本的副本: http : //alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command/

不涉及任何外部脚本的简单替代方法是使用SSH别名。 我知道原来的海报特意要求不要改变〜/ .ssh / config,但是我怀疑这里有个误会。

服务器上的本地用户与提交的人不一样,可以是与“git push”不同的人。

  • 在服务器上的托pipe软件可以作为一个单一的用户(通常'混帐')
  • 进行提交的人的身份只是git的buisness(添加到提交的元数据),与服务器无关,不受服务器上的身份validation
  • git push-er的身份是相关的,并且在基于ssh密钥的服务器上运行git hosting软件的系统上build立

因为这个原因,在执行push操作的系统上,即使对同一个本地帐户和同一个远程服务器,即使在同一个git仓库中,通过使用下面解释的方法使用ssh别名,也可以强制使用特定的身份。

假设您在gitorious.org服务器上有您的常规帐户,我们称之为“开发人员”。 您不希望自动推送您的“开发者”帐户[1] ,因此您为同步创build了另一个有意义的帐户,我们称之为“机器人”。

为了实现自动化,只能使用“机器人”帐户:

步骤1 :添加“机器人”到需要推送到的gitorius项目。

步骤2 :在本地机器上创build一个无关键的密钥(这将与机器人帐户有关)。

 ssh-keygen -f ~/.ssh/id_rsa_robot 

第三步 :在“机器人”账号上上传公钥〜/ .ssh / id_rsa_robot.pub。

第4步 :gitorious上的git SSH URI格式为git @ gitorious.org:prj_or_user / subproject.git 。 在〜/ .ssh / config文件中添加如下几行:

 host robot.gitorious.org HostName gitorious.org IdentityFile ~/.ssh/id_rsa_robot IdentitiesOnly "yes" 

这将确保:

  • 每当你使用“robot.gitorious.org”主机名,它将连接到gitorious.org(HostName选项),
  • 它将使用无密码的密钥在gitorius.org上进行身份validation(IdentiFile选项)和
  • 即使你运行了一个ssh代理,它也会忽略默认密钥并使用无密码的密码(IdentiesOnly“yes”)。

第5步 :假设您的项目的gigious SSH URI是'git@gitorious.org:project / project.git',在本地存储库中定义一个新的远程'autopush',稍微修改主机名:

 git remote add autopush git@robot.gitorious.org:project/project.git 

设置完成后,现在尝试通过“autopush”遥控器推动function。

 git push autopush master 

如果一切进展顺利,推动的变化,你应该看到你成功地推到“gitorious.org”作为“机器人”

[1]对于自动推送,必须为该账户生成一个无密码的密钥,但将其附加到具有代表性的“开发者”帐户将意味着自动化的工作可以推动任何“开发者”参与其中的gitourious项目。