Comment synchroniser automatiquement un dépôt Git

Récemment, j’ai créé un dépôt Git sur le serveur de ma maison que j’ai nommé « adambox » pour petit-à-petit remplacer Dropbox par cette solution plus… sécuritaire

Mais à chaque fois que je créais des fichiers, il fallait les ajouter au dépôt avec git add et synchroniser le dépôt local puis le depôt distant ce qui est un peu laborieux.

Pour le synchroniser sans avoir à taper à chaque fois les commandes git, j’ai créé un script bash qui ajoute les nouveaux fichiers automatiquement avec git add, et éxécute après cela git pull, git commit et enfin git push pour une synchronisation complète.

Voici le script bash simple qui permet la synchro git :
(Il est aussi disponible sur github https://github.com/adimux/gitsync)

gitsync

#!/bin/bash
#
# gitsync
#
# Auteur : Adimux <adam@cherti.name>
# Site web : adam.cherti.name
#
# Ce script synchronise un dépôt git en ajoutant automatiquement les nouveaux fichiers au dépôt et en ramenant les changements distants, puis poussant les changements locaux
# Utilisation du script :
# gitsync                       # Synchronise le dépôt courant
# gitsync path/to/repositorydir # Synchronise le dépôt dans le dossier /path/to/repositorydir

tosync=$1
cd "$tosync"

if git rev-parse --git-dir > /dev/null 2>&1; then # C'est un dépôt git valide
    root_dir=$(git rev-parse --show-toplevel) # Le répertoire racine du dépôt

    tosync=$root_dir
    git pull

    # On parcourt la liste des dossiers
    # et on "git add" tous les fichiers
    find | while read line; do
        if [[ (-d "$line") && ( "$line" != */.git/* ) ]]; then # On vérifie si c'est un dossier
            if [ "$(ls -A "$line")" ]; then # Si le dossier n'est pas vide
                if [[ "$(cd "$line" && git rev-parse --show-toplevel)" == "$(git rev-parse --show-toplevel)" ]] # On voit si ce n'est pas un sous-dépôt
                then
                    git add --all "$line"/* # On ajoute tous les fichiers dans le dossier
                fi
            fi
        fi
    done

    git commit -a -m 'auto update' # On commit avec comme message auto update
    git push
else # Ce n'est pas un dépôt
    echo "\"$tosync\" is not a valid git repository"
fi

Cliquez ici pour télécharger le script. Il faudra ensuite le rendre éxécutable avec :

chmod +x gitsync

Et pour l’utiliser directement en tapant son nom « gitsync », il faut le copier dans /usr/local/bin

sudo cp gitsync /usr/local/bin

Donc maintenant, vous pouvez synchroniser votre dépôt avec une commande seulement :

gitsync chemin_vers_le_depot

Si vous êtes dans le dossier du dépôt, il suffit donc de taper « gitsync »

Note : Ce script détecte aussi les sous-modules dans le dépôt et n’ajoute pas les fichiers du sous-module.

Programmer la synchronisation automatique du dépôt chaque 5 minutes

Si vous voulez faire une synchro automatique chaque 5 minutes (ou bien chaque jour/chaque semaine) de un ou plusieurs de vos dépôts  git, vous devez créer un script bash qui éxécute gitsync pour chaque dépôt. Et après cela automatiser son éxécution avec cron.

Créer le script qui synchronise tous les dépôts avec gitsync

Créez un script au nom de sync-all-repositories.sh dans votre home par exemple, qui contiendra :

sync-all-repositories.sh

#!/bin/bash

gitsync chemin_vers_depot1

gitsync chemin_vers_depot2

# ...

Rendez-le éxécutable

chmod +x sync-all-repositories.sh

Exécution de la synchro de tous les dépôts chaque 5 minutes avec Cron

Maintenant qu’on a créé sync-all-repositories.sh qui synchronise vos dépôts et qui se situe dans /home/nom_utilisateur/sync-all-repositories.sh

Il faut programmer son éxécution chaque 5 minutes avec cron :

D’abord, il faut se logger en root

sudo -s

Allez dans /etc/cron.d

cd /etc/cron.d

Créez-y un fichier au nom de mycrons

touch mycrons

Pour une synchronisation chaque 5 minutes, il faut éditer le fichier mycrons avec un éditeur comme gedit par exemple ou vim :

gedit mycrons

et mettre comme contenu pour une synchro chaque 5 minutes :


*/5 * * * * /home/nom_utilisateur/mysyncs.sh

Mais si vous voulez synchroniser le script une fois par heure, une fois par jour, une fois par semaine ou par mois, vous pouvez copier votre script mysyncs.sh respectivement dans /etc/cron.hourly ou /etc/cron.daily ou /etc/cron.weekly ou /etc/cron.monthly

Exemple : une fois par heure

sudo cp /home/nom_utilisatuer.mysyncs.sh /etc/cron.hourly

Pour personnaliser encore plus : l’éxécuter à midi chaque jour par exemple, vous pouvez lire ce tutoriel sur cron http://www.malekal.com/2010/11/12/tutorial-sur-lutilisation-de-cron-plannificateur-de-taches-de-gnulinux/

Comment faire pour que le serveur ne demande pas le mot de passe quand le script se connecte par ssh ?

Quand le script va être éxécuté automatiquement, git pull va demander le mot de passe de l’utilisateur git du serveur et votre belle synchronisation va être bloquée.

Pour pallier à ça, il faut suivre ces deux étapes

1) Générer la clé ssh

Pour éviter ça, il faut, avec l’utilisateur root générer la clé ssh :

D’abord se logger en root

sudo -i

Générer la clé

ssh-keygen -t rsa

Il faut générer la clé sans indiquer de mot de passe (donc quand on vous demande la passphrase, laissez-la vide et tapez Enter), sinon on va avoir le même problème.

Elle est générée généralement dans ~/.ssh/ qui contiendra deux fichiers : id_rsa qui est la clé privée et id_rsa.pub qui est la clé publique, et qu’on devra copier dans le serveur git

2) Copier la clé dans le serveur

Toujours en root, on copie la clé dans le home de l’utilisateur git de notre serveur :

scp  ~/.ssh/id_rsa.pub git@serveur:

On se connecte par ssh au serveur

ssh git@serveur

On copie le contenu de id_rsa.pub à la fin du fichier ~/.ssh/authorized_keys

cat id_rsa.pub >> ~/.ssh/authorized_keys

Et voilà !

Votre dépôt ou vos dépôts sont maintenant synchronisés automatiquement chaque 5 minutes ! Plus de souci de sortir de la maison et se dire « merde j’ai oublié de synchroniser le dépôt xy »

Cette méthode est également bonne pour se créer sa propre Dropbox et se passer des services cloud douteux !

Un commentaire:

  1. Bon script pour l’upload automatique!

    Pour cette ligne :
    git commit -a –no-edit # –no-edit pour ne pas lancer l’éditeur

    Il est possible aussi d’include un message automatique avec -m :
    git commit -a -m ‘auto update’

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *