Synchronisation GIT

GIT c'est la possibilité d'avoir un suivi des modifications. GIT c'est la possibilité de faire différentes variantes en s'y retrouvant plus ou moins. GIT c'est ctrl+Z, cmd+Z, ⌘+Z ou encore pomme+Z, mais à grande échelle. GIT c'est un arbre; des branches qui vont qui viennent dans tous les sens, mais un tronc commun qui devrait être solide. Mais est-ce que GIT ça peut faire serveur FTP ?

Si votre hébergement le permet, vous pouvez utiliser votre propre repo GIT comme gestionnaire de versions, de développement et de déploiement. Pour ce faire, il vous faut un accès SSH à votre hébergeur, et que celui-ci possède la commande "git".

$ > ssh user@server.com
$ > git --version
$ >>> git version 2.30.2

Une fois à la racine de votre hébergement ( ~/ ), faites un dossier "repos" et entrez-y pour y faire un repo git --bare, c'est à dire un repo sans fichiers ne contenant que "la base de données" des commits :

$ > cd ~
$ > mkdir repos
$ > cd ~/repos/

## Init GIT --bare #################
repos$ > git init --bare votre_projet.git 

Le dossier ./votre_projet.git est créé, contenant les données nécessaires à un repo GIT. Pour l'utiliser depuis votre machine de développement, rendez-vous dans le dossier cible à synchroniser et ajoutez un remote :

votre_dossier_projet$ >
git remote add production ssh://user@server.com/~/repos/votre_projet.git

Vous pouvez maintenant git add ./files , git commit -m "First !", git push sur votre propre repo !

...et le FTP dans tous ça ?

Ce n'est pas vraiment un serveur FTP, par contre GIT peut déployer vos changements PUSH grâce aux HOOKS ! Comment faire ?

Dans le dossier git sur votre serveur se trouve le dossier "hooks" contenant quelques exemples :

$ > ls ~/repos/votre_projet.git/hooks/
$ >>> applypatch-msg.sample
      commit-msg.sample
      pre-commit.sample
      pre-push.sample
      ... etc ...

Nous allons créer le hook pour le "post-receive" qui est lancé lorsqu'un PUSH est effectué et qui reçoit plusieurs arguments en entrée : oldrev, newrev, ref

$ > nano ~/repos/votre_projet.git/hooks/post-receive
### ou VIM si vous préférez ^^

Dans lequel nous pouvons coller et modifier le code Bash suivant :

#!/bin/bash

# Le dossier contenant le code PHP/javascript/etc que vous voulez
# garder synchronisé avec la branche "main", en chemin absolu.
TARGET="/home/USERID/projets/votre_projet/www"

# Votre dossier git précédemment créé
GIT_DIR="/home/USERID/repos/votre_projet.git"

# Ce script sera lancé après chaque PUSH "ref" reçu
while read oldrev newrev ref
do
    # Pour ne déployer que lorsque un PUSH est sur 'main'
    if [[ $ref =~ .*/main$ ]]; then
        echo "Main branch received. Deploying to production..."
        # Le code suivant demande à GIT de faire correspondre (-f) les
        # commits du dossier .git (--git-dir) au dossier de travail (--work-tree)
        # remplaçant ainsi les fichiers modifiés.
        git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f main
    fi
done

Une fois le fichier créé et enregistré, il faut impérativement lui donner des droits d’exécution afin que GIT puisse le lancer !

$ > chmod +x ~/repos/votre_projet.git/hooks/post-receive

Le fichier devrait maintenant contenir des droits d'exécutions (-x) que vous pouvez contrôler :

$ > ls -la ~/repos/votre_projet.git/hooks/post-*
$ >>> -rwxr-xr-x bla bla bla ~/repos/votre_projet.git/hooks/post-receive

Voilà c'est fait ! Dès lors, à chaque PUSH sur "main", votre dossier de production est également mis à jour sans passer par du FTP ! ^^ Et en plus vous avez tout un suivi de votre travail avec des branches git !

Utilisation de GIT sur son propre serveur, ou serveur mutualisé avec accès SSH, pour avoir un repo de développement et de déploiement.

Une fois configuré, un push sur main ou master permet la mise en ligne des fichiers modifiés sans passer par du FTP.