Créer un dépôt GIT et le gérer au quotidien

GIT est un outil fantastique mais, parfois, on peut se retrouver dans des situations particulièrement désagréables (collisions avec un dépôt distant par exemple, même si vous êtes le seul à publier...). Pour limiter les risques et comprendre ce qu'il faut faire, voici quelques commandes qui vous permettront de démarrer sans trop (je l'espère) de difficultés.

N'hésitez-pas à consulter la documentation officielle sur http://git-scm.com/

Pour commencer...

Initialiser le poste de travail

Installer GIT

Dans Ubuntu, installez les paquetages suivants :

apt-get install git git-gui gitk git-man meld

Configurer les paramètres généraux

git config --global user.name "Eric Quinton"
git config --global user.email "monadresse@gmail.com"

Initialiser le dépôt pour l'application

Dans le dossier considéré :

git init

Mettre à jour la liste des fichiers à ne pas suivre

Opération particulièrement importante. N'oubliez surtout pas les fichiers qui contiennent vos identifiants (de base de données, par exemple), sinon ils seront visibles par tous !

ouvrez le fichier .git/info/exclude. Voici une liste (non exhaustive, à adapter) de fichiers à ne pas suivre (projet PHP utilisant SMARTY) :

*~
param.inc.php
gacl.ini.php
templates_c/*
.project
.buidpath
.settings
.settings/*
*/templates_c/*

Opérations générales pour travailler avec un dépôt distant

Remarque : avant toute opération, vérifiez l'état de votre dépôt avec la commande :

git status

Récupérer les fichiers depuis un dépôt distant pré-existant

git clone [URL] [chemin_de_creation]

Le chemin dans lequel vous clonez le dépôt distant doit être vide avant l'opération.

Le dépôt distant est déclaré automatiquement dans votre dépôt local, sous le nom de origin.

Ajouter les fichiers modifiés dans votre dépôt local

git add .
git commit -m "message"
git status

La commande git add . va intégrer tous les fichiers nouveaux. Si vous souhaitez faire des commit différentiés selon les fichiers (voire les parties de fichiers), remplacez le point par le nom du fichier concerné.

La commande git status doit vous retourner : working directory clean. Tant que vous n'avez pas ce message, n'allez pas plus loin, et faites le nécessaire pour rendre votre dépôt propre.

Déclarer un dépôt distant

Uniquement à faire si vous n'avez pas exécuté, auparavant, la commande clone.

git remote add [nom_donné_localement] [URL]

Recopier des fichiers locaux vers un dépôt distant "neuf"

git push [nom_donné_localement] master

Récupérer les dernières modifications depuis le dépôt distant

git pull [nom_donné_localement] master

Arrêter le suivi de fichiers

Ponctuellement :

git update-index --assume-enchanged [fichier]

De façon définitive :

rajoutez le fichier à exclure dans .git/info/exclude, puis :

git rm --cached [fichier|chemin]

par exemple :

git rm --cached */templates_c/*

supprime toutes les compilations de templates smarty dans votre arborescence GIT.

Gérer les étiquettes

Ajouter une étiquette

Les étiquettes sont associées à un commit.

git status
git add .
git commit -m "version 1.0"
git show

Cette dernière instruction vous permet de visualiser l'identifiant du commit (il est également affiché après la commande git commit)

git tag -a v1.0 -m "version 1.0" [identifiant_commit]

L'identifiant du commit est une séquence de chiffres hexadécimaux. Il s'agit du début de la chaîne affichée via git show. En général, le fait de prendre les 6 ou les 8 premiers caractères vous évitent les risques de collisions, dans le contexte considéré.

git show v1.0

affiche la version étiquetée.

Pour mettre à jour le dépôt distant :

git push [nom_donné_localement] master
git push [nom_donné_localement] v1.0

Supprimer une étiquette

Supprimez d'abord l'étiquette dans votre dépôt local :

git tag -d v1.0

puis supprimez l'étiquette dans le dépôt distant :

git push --delete [nom_donné_localement] v1.0

Manipuler les branches

Les branches sont particulièrement utiles pour éviter de mélanger le code, surtout si vous travaillez à plusieurs. Au minimum, prévoyez :

  • master : la branche principale, qui contient les versions en production
  • develop : la branche dédiée au développement, fusionnée à chaque nouvelle version dans master
  • des branches de contenu (modules), soit par développeur (stagiaire...) soit par grande fonctionnalité du logiciel. Ces branches sont fusionnées quand nécessaire dans la branche develop.

Les commandes de manipulation des branches

git branch

Affiche la liste des branches existantes, la branche active étant précédée d'une étoile.

git branch [nom_de_la_branche]

Crée une nouvelle branche.

git checkout [nom_de_la_branche]

Bascule dans la branche considérée

git merge [nom_de_la_branche_a_fusionner]

Fusionne la branche indiquée dans la branche courante.

git merge --abort

Abandonne une fusion en cours, notamment s'il y a des conflits que vous ne souhaitez pas gérer immédiatement.

Récupérer le code correspondant à une version

C'est une opération utile pour réaliser une mise en production : vous n'avez pas besoin d'installer tout le code git dans un serveur. L'opération n'est réalisable qu'à partir du dépôt local (certains dépôts web vous proposent des fonctionnalités équivalentes, mais qui intègrent de la programmation).

Le principe est de créer un fichier zip qui correspond soit à l'état de votre branche, soit à une étiquette :

git archive --format=zip v1.0 > /tmp/appli_v1.0.zip

Ici, vous avez créé un fichier au format zip correspondant à l'état de votre dépôt pour l'étiquette v1.0.

Les outils graphiques

À la racine de votre application, là où est le dossier .git, lancez la commande git gui. Vous disposerez alors de 3 applications intégrées les unes aux autres, qui permettent :

  • git gui : réalisation des commit, gestion du dépôt distant, sélection des branches et fusions, etc.
  • gitk : visualisation de l'arborescence des commit, rajout des étiquettes
  • meld : gestion des conflits au sein des fichiers

Un peu de sécurité...

Ne stockez jamais dans votre arborescence GIT les fichiers qui contiennent les paramètres de connexion aux bases de données (voir ci-dessus le fichier des exclusions).

Si vous utilisez un dépôt git dans un serveur web (pratique en phase de développement, et cela peut être une option - pas forcément recommandée - pour la mise en production), il peut être judicieux d'interdire l'accès au dépôt depuis un navigateur. pour cela, créez, dans le dossier .git, le fichier .htaccess, et insérez dans celui-ci les lignes suivantes :

order deny, allow
deny from all