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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…