Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to specify which SSH key to use within git for git push in order to have gitorious as a mirror?

I have a project hosted on git.debian.org (alioth) and I'd like to configure a post-receive hook to update a mirror of the repository on http://gitorious.org

I suppose I'll have to use git push --mirror gitorious

Now, I'll need to have Alioth authorized on gitorious for the push to succeed. How do I do that?

I suppose I need to configure a user on gitorious and create a ssh key for it. And then when I do the git push in the post-receive hook, make sure this ssh key is used.

I could use a ~/.ssh/config but the problem is that many users can push on alioth, and everyone would have to log in and configure the ~/.ssh/config. Instead, I'd like to have a command line option or an environment variable to tell ssh which key to use. Can I do that?

Also, do you have other ideas how mirroring can be achieved? And, is it possible to configure it the other way around (gitorious pushing on alioth)?

like image 651
Mildred Avatar asked Aug 16 '10 18:08

Mildred


People also ask

How does git know which SSH key to use?

Git does not know, or care. It just runs ssh. Specifies that ssh(1) should only use the authentication identity files configured in the ssh_config files, even if ssh-agent(1) or a PKCS11Provider offers more identities. The argument to this keyword must be “yes” or “no”.

Which SSH key does git use by default?

ssh/id_rsa as the default key to use.


1 Answers

The answer is to be found in the git reference manual.

GIT_SSH

If this environment variable is set then git fetch and git push will use this command instead of ssh when they need to connect to a remote system. The $GIT_SSH command will be given exactly two arguments: the username@host (or just host) from the URL and the shell command to execute on that remote system.

To pass options to the program that you want to list in GIT_SSH you will need to wrap the program and options into a shell script, then set GIT_SSH to refer to the shell script.

Usually it is easier to configure any desired options through your personal .ssh/config file. Please consult your ssh documentation for further details.

So, I need to write a wrapper script, I write this push-gitorious.sh script:

#!/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 

Of course, you have to fill in the private key (the public key is included in the script for reference only. You also need to fill in the gitorious URL.

In the post-receive hook, you have to put:

path/to/push-gitorious.sh run 

The run option is important, otherwise it will run ssh directly.

Warning: no checking is done on the remote host identity. You can remove the option from the ssh command line and customize known_hosts if you want to. In this use case, I don't think it's important.

like image 111
Mildred Avatar answered Sep 22 '22 05:09

Mildred