Que feriez-vous ?

Le titre est provocateur. Pour ceux qui n'utilisent pas github, je me doute que vous ne ferez rien. Quoique...

Comme vous le savez, github est un service de gestion de projet utilisant git. Comme tout service administré par un tiers (qu'il soit libre ou non, ça ne change rien), sa pérennité n'est pas assurée.

Contrairement à beaucoup de services du "cloud", l'utilisation de github n'est pas le mal absolu, car étant basé sur un gestionnaire de version décentralisé, chaque contributeur possède une copie locale avec l'historique du code. Théoriquement, si github fermait, nous devrions pouvoir tout reconstituer avec ce que nous avons sur nos disques.

Dans la pratique, s'assurer d'avoir des copies à jour de ce qui nous intéresse, ce n'est pas du luxe. Joey Hess, l'un des développeurs dont j'apprécie le travail, a développé github-backup. Le logiciel est codé en Haskell et publié en GPL. L'utilisation est triviale, il suffit de lire le README.

Le principale avantage de ce logiciel est de récupérer les tickets ainsi que les forks (aspect de récursivité). C'est donc une sauvegarde complète. La limite provient de l'API de github, qui limite les requêtes. Il faut donc lancer parfois plusieurs fois le script, surtout lors de la première copie. Ensuite, naturellement, ça fonctionne en "diff".

Pour ma part, j'ai mis ce code python en trois minutes et lancé en tâche cron sur mon serveur. a, b et c sont bien entendu des dépôts fictifs.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: Francois Boulogne
# License: GPLv2+

import os from subprocess import call import random

repos = ['a', 'b', 'c', ] random.shuffle(repos)

backup_dir = os.path.expanduser('~/github_backup')

soft = 'github-backup'

for repo in repos:
    backup_path = os.path.join(backup_dir, repo)
    os.makedirs(backup_path, exist_ok=True)
    os.chdir(backup_path)
    call([soft, repo])

En quelques mots, le fonctionnement. Je mélange ma liste de dépôts. De cette manière, je ne commence jamais par le même dépôt, et j'évite qu'un dépôt sature le compteur de l'API de github et empêche ainsi la sauvegarde d'autres dépôts. Pour le reste, je crée des répertoires et je me place dedans pour synchroniser. Il faudrait que je maintienne un log pour être propre, avec le sortie de la commande.

On pourrait ensuite mettre en place une interface web là-dessus comme gitweb pour avoir un miroir visible par d'autres.

A titre personnel, je synchronise mon espace, mais aussi les projets que j'apprécie et qui sont hébergés sur github. Ce sont parfois de petits codes qui ne font pas la une de linuxfr, mais j'y accorde beaucoup d'importance. :)

Pour ce qui est de la question original, j'essaie de me poser systématiquement la question sur ce qui m'environne. Et si ça disparaissait ? Comment serait-je affecté ? Comment puis-je l'anticiper pour que ça se passe au mieux ?

 Note de septembre 2015.

Depuis un bon moment, j'ai eu des problèmes avec le code de Joey Hess et mes copies n'étaient pas complètes. J'ai donc automatisé un git fetch sur les dépôts que je veux synchroniser. C'est moins complet, mais bien plus robuste.

Code source : https://git.sciunto.org/Francois/gitbackup