Comment puis-je configurer git pour pousser automatiquement vers un référentiel distant (y compris fournir automatiquement ma phrase de passe) après chaque validation dans le référentiel local?
Tout d'abord, assurez-vous que vous pouvez pousser manuellement sans fournir votre mot de passe. Si vous poussez sur HTTP ou HTTPS, ce sera le cas soit création d'un .netrc
fichier avec les informations de connexion ou en ajoutant votre nom d'utilisateur et votre mot de passe dans l'URL de la télécommande . Si vous utilisez SSH, vous pouvez soit créer une paire de clés où la clé privée n'a pas de mot de passe, soit tilisez ssh-agent
pour mettre en cache votre clé privée .
Ensuite, vous devez créer un exécutable (chmod +x
) fichier dans .git/hooks/post-commit
qui contient les éléments suivants:
#!/bin/sh
git Push Origin master
... personnalisation de cette ligne si vous souhaitez envoyer à une télécommande autre que Origin
, ou pousser une branche autre que master
. Assurez-vous de rendre ce fichier exécutable.
Si vous commencez à utiliser plus que la branche principale, vous souhaiterez peut-être pousser automatiquement la branche actuelle. Mon crochet (.git/hooks/post-commit
) ressemble à ça:
#!/usr/bin/env bash
branch_name=$(git symbolic-ref --short HEAD`)
retcode=$?
non_Push_suffix="_local"
# Only Push if branch_name was found (my be empty if in detached head state)
if [ $retcode -eq 0 ] ; then
#Only Push if branch_name does not end with the non-Push suffix
if [[ $branch_name != *$non_Push_suffix ]] ; then
echo
echo "**** Pushing current branch $branch_name to Origin [i4h post-commit hook]"
echo
git Push Origin $branch_name;
fi
fi
Il pousse la branche courante, s'il peut déterminer le nom de la branche avec git symbolic-ref.
" Comment obtenir le nom de la branche actuelle dans Git? " traite de cela et d'autres façons d'obtenir le nom de la branche actuelle.
Un Push automatique pour chaque branche peut être dérangeant lorsque vous travaillez dans des branches de tâches où vous vous attendez à ce que fabrication de saucisses se produise (vous ne pourrez pas rebaser facilement après avoir poussé). Le hook ne poussera donc pas les branches qui se terminent par un suffixe défini (dans l'exemple "_local").
Créez un fichier nommé "post-commit" dans le répertoire .git/hooks avec le contenu "git Push", bien que si vous souhaitez fournir automatiquement un mot de passe, une modification sera nécessaire.
Ce script git-autopush vous permet de configurer un hook post-commit, similaire à ce qui a été recommandé dans " Comment configurer la poussée automatique? ".
Mais pour la phrase secrète, vous devez exécuter un ssh-agent
.
Voici des instructions simples pour pousser/tirer sans fournir de phrase secrète sur ssh pour les personnes utilisant Linux et Windows (git bash)
Sur votre client:
Vérifiez si vous avez généré des clés ssh:
$ ls ~/.ssh/id_rsa.pub; ls ~/.ssh/id_dsa.pub
/c/Users/Cermo/.ssh/id_rsa.pub <-- I have RSA key
ls: cannot access '/c/Users/Cermo/.ssh/id_dsa.pub': No such file or directory
Si vous n'avez pas de clé (deux lignes "ls: impossible d'accéder ..."), générez-en une nouvelle. Si vous avez l'une des clés, ignorez cette étape.
$ ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Cermo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <-- press Enter
Enter same passphrase again: <-- press Enter
Copiez votre clé sur le serveur distant à partir duquel vous souhaitez extraire ou pousser à l'aide de git:
$ ssh-copy-id user_name@server_name
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to
filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you
are prompted now it is to install the new keys
user_name@server_name's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user_name@server_name'"
and check to make sure that only the key(s) you wanted were added.
Remarque: Vous devrez fournir un mot de passe lors de cette opération. Après cela, vos opérations Pull/Push ne demanderont pas de mot de passe.
Remarque 2: Vous devez vous connecter au serveur en utilisant nom_utilisateur au moins une fois avant d'utiliser cette procédure (le répertoire personnel dans lequel les clés ssh sont copiées est créé lors de la première connexion)
Voici le script bash pour git pour automatiquement Push
vers un dépôt distant
$ cd /path/to/your/repository
puis $ Push
Mettez ce script dans un fichier par exemple $HOME/.ssh/Push
#!/bin/bash
# Check connection
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent` > /dev/null
# Check if git config is configured
if [ ! $(git config user.name) ]
then
git config --global user.name <user_name>
git config --global user.email <user_email>
fi
# Check if expect is installed
if [[ ! $(dpkg -l | grep expect) ]]
then
apt-get update > /dev/null
apt-get install --assume-yes --no-install-recommends apt-utils expect > /dev/null
fi
# Check identity
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent > /dev/null
# Clean and Push repo
REMOTE=$(git remote get-url Origin)
[email protected]:${REMOTE##*github.com/}
[[ $REMOTE == "http"* ]] && git remote set-url Origin $URL
git add . && git commit -m "test automatically Push to a remote repo"
git status && git Push Origin $(git rev-parse --abbrev-ref HEAD) --force
Liez-le à /bin
répertoire afin qu'il puisse être appelé par $ Push
commande
$ Sudo ln -s $HOME/.ssh/Push /bin/Push
$ chmod +x /bin/Push