git diff de fichiers OpenDocument (Libreoffice)

Chez FAIMaison, nous utilisons git massivement pour collaborer sur des documents. Très pratique pour tous les formats texte, je peux relire mes modifications avant de les commiter avec un git diff.

Pour ce qui est des documents binaires, notamment OpenDocument1, ça se corse :

$ git status
modifié:         liste.ods

$ git diff
Binary files a/liste.ods and b/liste.ods

Je sais que le document a été modifié, pas plus. C'est gênant :

  • Je ne peux pas me relire ;
  • je n'ai peut-être pas même modifié le contenu de document, mais fait un essai, puis annulé cet essai et enregistré le document, ne modifiant que les métadonnées, dont les autres utilisateurs du dépôt n'ont cure.

Odt2txt à la rescousse

Git propose le mécanisme de textconv pour les formats binaires : si on lui indique un outil permettant d'obtenir une version texte d'un fichier, git est capable de présenter les différences entre 2 versions d'un fichier, même binaire.

On utilise ici l'outil odt2txt qui en dépit de son nom sait gérer tous les formats ODF (ods, odt...), Debian propose un paquet.

Voilà par exemple à quoi ressemble une liste de course sur 2 colonnes, issue d'un tableur :

$ odt2txt /tmp/test.ods

œufs

6

lait

2L

chocolat

200g

Ça n'est pas beau, la mise en forme tabulaire est perdue, mais nous avons l'information, sans fioritures.

Configuration globale (côté utilisateur)

On indique à git un filtre odf qui utilise odt2txt :

git config --global diff.odf.textconv "odt2txt"

Cette modification est globale à l'utilisateur (fichier ~/.gitconfig).

Configuration locale (côté dépôt)

Il faut ensuite indiquer pour quelles extensions de de fichiers utiliser ce filtre, cela peut être fait localement au niveau du dépôt (dépôt/.gitattributes)

.gitattributes

*.ods diff=odf
*.odt diff=odf

Et ça fonctionne :)

$ git diff
diff --git a/liste.ods b/liste.ods
index 6708847..da12798 100644
--- a/liste.ods
+++ b/liste.ods
@@ -11,3 +11,7 @@ chocolat

 200g

+crème
+
+1L

Bonus : sans configuration dans le dépôt

Si on préfère que la configuration concerne l'utilisateur et non le dépôt2 :

git config --global core.attributesfile ~/.gitattributes

On peut ensuite utiliser un fichier par utilisateur sans toucher au dépôt : ~/.gitattributes.

Limites

Vous ne verrez pas les modifications de style ou de méta-informations, mais cela n'empêche nullement de les commiter si vous savez qu'elles sont présentes.

Références


  1. Les formats open-document ne sont pas stricto-sensu des formats binaires, puisqu'il s'agit de fichiers XML dans un zip, mais ils n'en demeurent pas moins humainement illisibles

  2. Vu que le filtre est lui forcément défini côté utilisateur, c'est cohérent