41

我有一个托管在 git.debian.org (alioth) 上的项目,我想配置一个 post-receive 挂钩来更新http://gitorious.org上的存储库镜像

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

现在,我需要在 gitorious 上授权 Alioth 才能使推送成功。我怎么做?

我想我需要在 gitorious 上配置一个用户并为其创建一个 ssh 密钥。然后当我在 post-receive 钩子中执行 git push 时,确保使用了这个 ssh 密钥。

我可以使用 a~/.ssh/config但问题是许多用户可以推送 alioth,每个人都必须登录并配置~/.ssh/config. 相反,我想要一个命令行选项或一个环境变量来告诉 ssh 使用哪个键。我可以这样做吗?

另外,您还有其他想法如何实现镜像?而且,是否可以反过来配置它(gitorious push on alioth)?

4

3 回答 3

38

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

GIT_SSH

如果设置了此环境变量,则 git fetch 和 git push 在需要连接到远程系统时将使用此命令而不是 ssh。该$GIT_SSH命令将有两个参数:来自 URL 的 username@host(或只是主机)和要在该远程系统上执行的 shell 命令。

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

.ssh/config通常,通过您的个人文件配置任何所需的选项会更容易。请查阅您的 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

当然,你必须填写私钥(公钥包含在脚本中,仅供参考。你还需要填写gitorious URL。

在 post-receive 挂钩中,您必须输入:

path/to/push-gitorious.sh run

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

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

于 2010-08-17T07:42:10.717 回答
30

这是我知道的两种方法,以便您可以在 git 命令行中指定要用于 git 站点的任何密钥文件。您无需在配置文件或脚本中硬编码此密钥文件。您只需在 git 命令行中直接提供它。

方法一:使用 GIT_SSH 环境变量

在命令行中的用法是这样的:

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

要使用此命令,您需要进行一些预先设置。首先,创建一个包含以下内容的 shell 脚本:

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

接下来,导出 GIT_SSH 变量并将其设置为与上述 shell 脚本的位置相同的值。

$ export GIT_SSH=~/ssh-git.sh

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

该脚本必须是可执行的,因此请执行 chmod:

$ chmod +x ~/ssh-git.sh

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

$ 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 时,只需将其提供给 PKEY 变量即可。只要预先配置了 GIT_SSH,您就可以忘记其他所有内容。

记下 PKEY 变量。您可以使用任何名称,只要它与 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/

于 2013-03-24T09:41:42.283 回答
3

不涉及任何外部脚本的更简单的替代方法是使用 SSH 别名。我知道原发帖人特别要求不要更改~/.ssh/config,但我怀疑这里有误会。

服务器上的本地用户与执行提交的人不同,并且可以与执行“git push”的人不同。

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

出于这个原因,在执行推送的系统上,即使是相同的本地帐户和相同的远程服务器,甚至在同一个 git 存储库中,也可以通过使用下面解释的方法使用 ssh 别名来强制使用特定身份。

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

对于自动化,仅使用“机器人”帐户:

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

第 2 步:在本地机器上创建一个无密码密钥(这将与 gitorious 上的机器人帐户相关联)。

ssh-keygen -f ~/.ssh/id_rsa_robot

第 3 步:将公钥 ~/.ssh/id_rsa_robot.pub 上传到 'robot' 帐户的 gitorious 上。

第 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(主机名选项),
  • 它将使用无密码密钥在 gitorius.org(IdentiFile 选项)上作为机器人进行身份验证,并且
  • 即使您运行了 ssh 代理,它也会忽略默认密钥并使用无密码密钥(IdentiesOnly “yes”)。

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

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

设置完成,现在尝试通过'autopush'遥控器推送到gitorious。

git push autopush master

如果一切顺利并且有要推送的更改,您应该会看到您已成功推送到 'gitorious.org' 作为 'robot'

[1] 对于自动推送,必须为帐户生成无密码密钥,但是将其附加到 gitorious 'developer' 帐户意味着自动化作业可以推送到任何涉及 gitorious 的 'developer' 的 gitourious 项目。

于 2014-10-05T16:27:00.113 回答