如何指定在git中使用哪个SSH密钥进行git push以便将镜像作为镜像?

Mil*_*red 39 git hook gitorious mirroring git-push

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

我想我必须要用 git push --mirror gitorious

现在,我需要让Alioth获得授权才能获得成功.我怎么做?

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

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

另外,您是否有其他想法可以实现镜像?并且,是否有可能以相反的方式配置它(有效推动阿里斯)?

Mil*_*red 38

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

GIT_SSH

如果设置了此环境变量,那么git fetch和git push将在需要连接到远程系统时使用此命令而不是ssh.该$GIT_SSH命令将给出两个参数:来自URL的username @ host(或只是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
Run Code Online (Sandbox Code Playgroud)

当然,您必须填写私钥(公钥包含在脚本中仅供参考.您还需要填写好的URL.

在post-receive钩子中,你必须把:

path/to/push-gitorious.sh run
Run Code Online (Sandbox Code Playgroud)

运行选项很重要,否则它将直接运行ssh.

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


alv*_*bad 28

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

方法1:使用GIT_SSH环境变量

在命令行中的用法如下:

$ PKEY=~/.ssh/keyfile.pem git clone git@github.com:me/repo.git
Run Code Online (Sandbox Code Playgroud)

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

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

接下来,导出并设置GIT_SSH变量的值等于上面的shell脚本的位置.

$ export GIT_SSH=~/ssh-git.sh
Run Code Online (Sandbox Code Playgroud)

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

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

$ chmod +x ~/ssh-git.sh
Run Code Online (Sandbox Code Playgroud)

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

$ PKEY=~/.ssh/keyfile1.pem git clone git@github.com:me/repo.git
Run Code Online (Sandbox Code Playgroud)

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

$ PKEY=~/.ssh/keyfile2.pem git clone git@myothersite.com:other/repo.git
Run Code Online (Sandbox Code Playgroud)

这支持您要使用的任何密钥文件.每次你需要使用你想要使用的密钥文件运行git时,只需将它提供给PKEY变量即可.只要预先配置了GIT_SSH,您就可以忘记其他所有内容.

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

方法2:使用包装器脚本

包装器脚本的用法如下:

$ git.sh -i ~/.ssh/keyfile.pem clone git@github.com:me/repo.git
Run Code Online (Sandbox Code Playgroud)

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

这不需要预先设置shell脚本和GIT_SSH.您只需要使用git命令下载并运行此单个包装器脚本.

您可以在此处获取此包装脚本的副本:http: //alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command/