Stockage de fichiers avec Git

Il est possible d'utiliser Git pour versionner les fichiers et documents. C'est utile pour partager les documents, mais aussi pour garder les anciennes versions en cas de mauvaises manipulation : suppression, écrasement, etc.

Dans l'exemple suivant, on suppose que l'instance de l'association est hébergée dans /home/moi/www/garradin, et que git est installé.

Exemple

Pour cela il convient de créer un nouveau repository git, par exemple dans /home/moi/documents si votre utilisateur s'appelle moi :

mkdir /home/moi/documents
cd /home/moi/documents
git init

Il faut ensuite configurer Garradin pour qu'il stocke ses fichiers dans le répertoire documents, en éditant le fichier config.local.php qui doit commencer par :

<?php

namespace Garradin;

À la suite, rajouter la configuration suivante (voir le fichier config.dist.php pour une explication détaillée de la configuration) :

const FILE_STORAGE_BACKEND = 'FileSystem';
const FILE_STORAGE_CONFIG = '/home/moi/documents';

Il faut ensuite se rendre dans l'onglet "Avancé" de la configuration pour migrer les fichiers vers ce répertoire, en cliquant sur le bouton "Copier tous les fichiers vers FileSystem".

À ce stade, les répertoires et fichiers doivent avoir été créés dans /home/moi/documents, avec des sous-répertoires comme user, web, skel, etc.

Il faut maintenant rajouter tout cela à git :

cd /home/moi/documents
git add -A
git commit -a -m "Premier commit"

git -A permet d'ajouter les fichiers et répertoires non-suivis, et git commit -a de faire un commit avec toutes les modifications, -m étant pour indiquer le contenu du message de commit. Il est possible qu'à ce stade git vous demande votre nom et adresse email.

Maintenant nous allons mettre en place une prise en compte automatique des modifications, toutes les 5 minutes :

crontab -e

Et rajouter à la fin du fichier une nouvelle ligne :

*/5 * * * * cd /home/moi/documents && git reset -q --merge && git add -A > /dev/null && git commit -q -a -m "Synchro"

En plus des commandes vues plus haut, nous avons rajouté un paramètre -q qui signifie "quiet" pour ne pas recevoir de mail toutes les 5 minutes. On a aussi rajouté une commande git reset qui est utile pour intégrer les modifications (push) si vous avez des interventions externes.

Ainsi toute modification faite depuis Garradin sera automatiquement prise en compte et versionnée dans le repository git !

Modifier le repository git depuis l'extérieur

Pour chaque personne intervenant sur le repository vous devez désormais leur créer un accès SSH en ajoutant leur clé SSH publique au fichier /home/moi/.ssh/authorized_keys (une clé par ligne). Voir ce guide pour générer une clé SSH.

ssh-rsa XXXX...XXXXX utilisateur@machine

Rajouter au début de la ligne, avant ssh-rsa les instructions suivantes :

no-port-forwarding,no-agent-forwarding,command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"" 

Ce qui permet de contraindre l'utilisateur à ne pouvoir utiliser que git, pour des raisons de sécurité. Cela donne ainsi la ligne suivante :

no-port-forwarding,no-agent-forwarding,command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-rsa XXXX...XXXXX utilisateur@machine

L'utilisateur peut désormais se connecter à la machine en tant qu'utilisateur moi avec git et récupérer le repository :

git clone ssh://moi@serveur.association.tld/~/documents/

Et de la même manière il peut modifier les fichiers, les commiter avec git commit et les renvoyer avec git push, sans oublier de récupérer les modifications régulièrement avec git pull.

Répertoire synchronisé automatiquement

Il est également possible de synchroniser automatiquement le répertoire de l'utilisateur extérieur. Par exemple si vous avez un ordinateur dans votre association et vous voulez avoir une copie des documents disponible directement (sous-répertoire documents du repository), mais ne pas forcément donner accès aux documents des membres etc.

Dans ce cas il est conseillé de placer le repository git dans un répertoire caché, par exemple /home/bureau/.documents et faire un lien symbolique de ~/documents vers ~/documents/documents.

git clone ssh://moi@serveur.association.tld/~/documents/ ~/.documents
ln -s ~/.documents/documents ~/documents

puis de mettre en crontab un script comme celui-ci :

#!/bin/bash

cd ~/.documents

git add -A -a && git commit -a -m "Commit automatique depuis ordinateur association" > /dev/null
git pull -q && git push -q

Ainsi on a un répertoire qui est synchronisé automatiquement entre Garradin et votre ordinateur !