Cela fait désormais un sacré moment que j'ai publié ma revue des solutions de synchronisation. Comme souligné par un commentaire récent, un petit retour est nécessaire.

J'utilise git pour coder. J'utilise aussi git pour synchroniser mes fichiers grâce à mon serveur auto-hébergé. Git, c'est bon, il faut en manger matin, midi et soir. L'idée de dvcs-autosync était bonne, mais il y avait quelques bugs génants et je ne suis pas allé voir les forks. Alors, je pousse mes commits à la main. Ce n'est pas si fastidieux. A part ce point, j'ai cependant un problème. L'un de mes dépôts est dédié à synchroniser des pdf, beaucoup de pdf, environ 500, ce qui représente plusieurs Go. Ajouter/synchroniser de nouveaux fichiers ne pose pas de problèmes, mais si je devais synchroniser à un nouvel endroit, ce serait... interminable.

Il existe un projet kickstarter que je trouve génial. Je ne comprend pas pourquoi peu de gens en parle d'ailleurs. Un joli contre-exemple à ce qui est dit dans cet article de linuxfr. Grâce à l'argent des donateur, l'auteur travaille sur le projet depuis plus de 200 jours et pour les petits tests que j'ai mené, je trouve que le travail est excellent. Si vous vous demandez pourquoi sparkleshare, dvcs-autosync ou sharebox ne conviennent pas, je vous laisse lire son argumentation. Ca fait plusieurs mois que je surveille ce projet, et j'ai décidé de m'y mettre sérieusement. D'où le présent billet.

Quel est le principe de git annex pour gérer les gros fichiers ? Très simple. Plutôt que de synchroniser le fichier lui-même, on synchroniser un lien symbolique pointant vers le fichier. Ainsi, lorsqu'on "pull" le dépôt, on récupère l'arborescence des fichiers qui sont ces liens. Ceci permet de les réorganiser par exemple, sans avoir à télécharger les fichiers. C'est un gain impressionnant. Si on veut lire le fichier, il suffit de télécharger ce fichier spécifiquement. Il peut d'ailleurs être retiré par la suite une fois que les modifications ont été poussée. Ainsi, on gagne de l'espace disque.

Voici en quelque ligne, un usage de base :

git init # crée le dépôt
git annex init "my laptop" # crée une instance annex
git annex add big_file.dat # ajoute un fichier à annex
git ci -a # commit

Maintenant, on clone le dépôt que nous venons de créer :

git clone ...
# là, les fichiers ne sont pas lisibles
cat big_file.dat
# mais on peut les télécharger
git annex get big_file.dat
# et les lire !
cat big_file.dat
# et on peut supprimer le contenu en gardant le lien symbolique
git annex drop big_file.dat

Git annex est donc conçu pour des gros fichiers, de type photos, musiques, vidéos, données... et il peut être utilisé pour - Synchroniser deux machines. - Partager avec des amis. (jabber inside) - ou archiver. Le développeur est Joey Heiss, j'ai déjà parlé ici de ces logiciels (github-backup et ikiwiki).