J'ai un projet hébergé sur git.debian.org (alioth) et je voudrais configurer un hook post-réception pour mettre à jour un miroir du référentiel sur http://gitorious.org
Je suppose que je vais devoir utiliser git Push --mirror gitorious
Maintenant, je devrai faire autoriser Alioth sur gitorious pour que le Push réussisse. Comment je fais ça?
Je suppose que je dois configurer un utilisateur sur gitorious et créer une clé ssh pour cela. Et puis quand je fais le git Poussez le crochet post-réception, assurez-vous que cette clé ssh est utilisée.
Je pourrais utiliser un ~/.ssh/config
mais le problème est que de nombreux utilisateurs peuvent pousser sur alioth, et tout le monde devrait se connecter et configurer le ~/.ssh/config
. Au lieu de cela, j'aimerais avoir une option de ligne de commande ou une variable d'environnement pour dire à ssh quelle clé utiliser. Puis-je faire cela?
De plus, avez-vous d'autres idées sur la manière de réaliser la mise en miroir? Et, est-il possible de le configurer dans l'autre sens (pousser gitieusement sur alioth)?
La réponse se trouve dans le manuel de référence git .
GIT_SSH
Si cette variable d'environnement est définie, git fetch et git Push utiliseront cette commande au lieu de ssh lorsqu'ils doivent se connecter à un système distant. Le
$GIT_SSH
la commande recevra exactement deux arguments: le nom d'utilisateur @ Host (ou simplement Host) de l'URL et la commande Shell à exécuter sur ce système distant.Pour passer des options au programme que vous souhaitez répertorier dans
GIT_SSH
vous devrez envelopper le programme et les options dans un script Shell, puis définirGIT_SSH
pour faire référence au script Shell.Habituellement, il est plus facile de configurer les options souhaitées via votre _
.ssh/config
fichier. Veuillez consulter votre documentation ssh pour plus de détails.
Donc, j'ai besoin d'écrire un script wrapper, j'écris ceci 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
Bien sûr, vous devez remplir la clé privée (la clé publique est incluse dans le script pour référence uniquement. Vous devez également remplir l'URL gitorious.
Dans le crochet post-réception, vous devez mettre:
path/to/Push-gitorious.sh run
L'option run est importante, sinon elle exécutera ssh directement.
Avertissement: aucune vérification n'est effectuée sur l'identité de l'hôte distant. Vous pouvez supprimer l'option de la ligne de commande ssh et personnaliser known_hosts
si tu veux. Dans ce cas d'utilisation, je ne pense pas que ce soit important.
Il existe deux méthodes que je connais afin que vous puissiez spécifier n'importe quel fichier de clés que vous souhaitez utiliser pour un site git sur la ligne de commande git. Vous n'avez pas besoin de coder en dur ce fichier de clés dans un fichier de configuration ou un script. Vous fournissez simplement ceci directement sur la ligne de commande git.
Méthode 1: utilisez la variable d'environnement GIT_SSH
L'utilisation sera comme ceci sur la ligne de commande:
$ PKEY=~/.ssh/keyfile.pem git clone [email protected]:me/repo.git
Pour utiliser cette commande, vous devez effectuer une pré-configuration. Créez d'abord un script Shell avec le contenu suivant:
#!/bin/sh
if [ -z "$PKEY" ]; then
# if PKEY is not specified, run ssh using default keyfile
ssh "$@"
else
ssh -i "$PKEY" "$@"
fi
Ensuite, exportez et définissez la variable GIT_SSH avec une valeur égale à l'emplacement du script Shell ci-dessus.
$ export GIT_SSH=~/ssh-git.sh
où ~/ssh-git.sh est le nom de fichier du script Shell ci-dessus.
Le script doit être exécutable, alors faites un chmod:
$ chmod +x ~/ssh-git.sh
Vous pouvez maintenant exécuter cette commande avec n'importe quel fichier de clés que vous choisissez d'utiliser:
$ PKEY=~/.ssh/keyfile1.pem git clone [email protected]:me/repo.git
Pour utiliser un autre fichier de clés pour un autre hôte:
$ PKEY=~/.ssh/keyfile2.pem git clone [email protected]:other/repo.git
Cela prend en charge tout fichier clé que vous souhaitez utiliser. Chaque fois que vous devez exécuter git avec un fichier de clés que vous souhaitez utiliser, fournissez-le simplement à la variable PKEY. Vous pouvez oublier tout le reste tant que le GIT_SSH a été préconfiguré.
Prenez note de la variable PKEY. Vous pouvez utiliser n'importe quel nom tant qu'il correspond à ce qui est utilisé dans le script Shell vers lequel pointe GIT_SSH.
Méthode 2: utilisez un script wrapper
L'utilisation du script wrapper ressemblera à ceci:
$ git.sh -i ~/.ssh/keyfile.pem clone [email protected]:me/repo.git
Cette utilisation est intuitive car elle ressemble à l'exécution de ssh avec l'option -i.
Cela ne nécessite pas de pré-configuration d'un script Shell et de GIT_SSH. Il vous suffit de télécharger et d'exécuter ce script d'encapsuleur unique avec la commande git.
Vous pouvez obtenir une copie de ce script wrapper ici: http://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git -commande /
Une alternative plus simple qui n'implique aucun script externe consiste à utiliser un alias SSH. Je sais que l'affiche originale a spécifiquement demandé de ne pas modifier ~/.ssh/config, mais je soupçonne qu'il y a un malentendu ici.
L'utilisateur local sur le serveur n'est pas le même que la personne qui effectue le commit et peut être une personne différente de celle qui fait le 'git Push'.
Pour cette raison, sur le système faisant le Push on peut forcer une identité spécifique même pour le même compte local et le même serveur distant, même dans le même référentiel git en utilisant un alias ssh en suivant la méthode expliquée ci-dessous.
Supposons que vous ayez sur le serveur gitorious.org votre compte habituel, appelons-le "développeur". Vous ne voulez pas pousser automatiquement en utilisant votre compte "développeur" [1] , donc vous créez un autre compte gitorious pour la synchronisation, appelons-le " robot'.
Pour l'automatisation, seul le compte "robot" sera utilisé:
Étape 1: Ajoutez 'robot' au projet gitorius qui doit être poussé.
Étape 2: Sur la machine locale, créez une clé sans mot de passe (elle sera associée au compte du robot sur gitorious).
ssh-keygen -f ~/.ssh/id_rsa_robot
Étape: téléchargez la clé publique ~/.ssh/id_rsa_robot.pub sur gitorious dans le compte 'robot'.
Étape 4: Les URI git SSH sur gitorious ont le format git @ gitorious.org: prj_or_user/subproject.git . Dans votre fichier ~/.ssh/config, ajoutez les lignes suivantes:
Host robot.gitorious.org
HostName gitorious.org
IdentityFile ~/.ssh/id_rsa_robot
IdentitiesOnly "yes"
Cela garantira que:
Étape 5: En supposant que l'URI SSH sur gitorious pour votre projet est '[email protected]: project/project.git', dans le référentiel local définissez un nouveau 'autopush' distant avec un hôte légèrement modifié Nom:
git remote add autopush [email protected]:project/project.git
La configuration est terminée, essayez maintenant de pousser vers gitorious via la télécommande 'autopush'.
git Push autopush master
Si tout s'est bien passé et qu'il y a des changements dans Push, vous devriez voir que vous avez réussi à être poussé vers 'gitorious.org' en tant que 'robot'
[1] Pour les push automatiques, une clé sans mot de passe doit être générée pour le compte, mais l'attacher au compte "développeur" gitieux signifierait que le travail automatisé peut pousser vers n'importe quel projet gitourious où 'développeur' est impliqué sur gitorious.