Il est des semaines où on doit troquer son IDE préféré pour des outils bizarres tels que OpenOffice LibreOffice, Microsoft Office, voire pire… Microsoft Project. Or avec ces outils, on a vite fait de perdre plusieurs heures de travail avec une fausse manipulation. Afin de palier à ce problème, j’ai mis à contribution un de mes outils préférés : git. Il n’y a pas de raison que les documents ne soient pas versionnés, au même titre que du code. D’autant plus que le coût de mise en place d’une telle sauvegarde est très faible :

1
2
3
git init
git add mondocument
git commit -m 'Première sauvegarde de mon document'

Diff entre deux versions

En commitant régulièrement son document, on en constitue un historique. Et avec les branches, on peut même le décliner en plusieurs versions. Je n’ai par contre pas réussi à créer de « feature branch » documentaire, la fusion automatique de documents binaires avec git se passant bizarrement assez mal.

L’autre problème avec des documents binaires, c’est qu’ils passent assez mal dans le « diff », ce qui fait perdre à la gestion de configuration une partie de son intérêt. Mais pour ce problème là, il existe une solution. Il suffit d’avoir un outil permettant d’afficher un document un mode texte. Dans le cas du format OpenDocument, on peut par exemple utiliser odt2txt.

Il faut ajouter dans .gitconfig le bloc suivant, pour déclarer le convertisseur associé au format odf :

1
2
[diff "odf"]
    textconv=odt2txt

Enfin, dans le répertoire du dépôt du projet, il faut associé ce convertisseur avec les extensions des fichiers OpenOffice. Ca se passe dans le fichier info/attributes :

1
2
3
*.odt diff=odf
*.ott diff=odf
# idem pour les formats ods, ots, odp et otp

Cette modification effectuée, on récupère la possibilité de calculer le différentiel entre deux commits, et toutes les fonctionnalités associées.

Le seul inconvénient, c’est qu’il faut répéter cette opération pour chaque dépôt de documents. Je n’ai pas trouvé le moyen de définir ces comportements dans la configuration globale de git. Si quelqu’un a une solution, je suis preneur !

Automatisation de la sauvegarde

Afin d’améliorer un peu le processus, il suffit d’un petit script shell qui automatise l’enregistrement du document à intervalles réguliers :

1
2
3
4
5
6
7
8
9
#!/bin/sh
# Intervalle entre deux enregistrements
SAVE_PERIOD_IN_SECONDS=120
while :
do
    echo "Autosave : $(date)"
    git commit -a -m "Autosave $(date)"
    sleep $SAVE_PERIOD_IN_SECONDS
done

Ce script utilise une des particularités intéressantes de git : si le fichier n’a pas évolué pendant l’intervalle, le commit n’est pas effectué. Ainsi, l’historique des versions du document pourra sauter des enregistrements (si on a oublié d’enregistrer le document entretemps par exemple).

Pour finir, voici donc le script en action :

Sauvegarde automatique de document avec git

Sauvegarde automatique de document avec git