Comment stocker des fichiers volumineux dans Git –
Git, ainsi que des services comme Github, sont conçus et optimisés pour des fichiers de code texte légers, et il est rare de voir des référentiels de plus de quelques Go. Mais, il est souvent utile de suivre les gros fichiers, et pour faciliter cela, Git fournit l’extension Large File Storage (LFS).
Sommaire
Comment fonctionne Git Large File Storage (LFS)
Git n’a techniquement pas de taille de fichier maximale, mais il commence à tomber en panne une fois que vous commencez à atteindre une certaine taille de fichiers. Github définit ce maximum à 100 Mo par référentiel.
Cette limite souple se résume à la façon dont Git stocke les données en interne. Bien qu’il affiche les listes de modifications des utilisateurs, appelées diffs, Git utilise en fait une approche basée sur des instantanés pour stocker les données en interne, et l’utilise pour reconstruire les diffs, plutôt que l’inverse.
C’est bien pour de petites quantités de données, mais cela signifie que chaque fois qu’un fichier est modifié, un instantané doit être fait, et donc si le fichier est très volumineux, il peut rapidement prendre beaucoup de place. Git gère cela un peu en interne avec des « packfiles », qui peuvent faire du ramasse-miettes, mais le problème de travailler avec des fichiers volumineux demeure.
Ainsi, une solution appelée Git Large File Storage (LFS) a été créée. Fondamentalement, plutôt que de stocker le fichier réel dans le référentiel, Git LFS stocke simplement un pointeur vers l’endroit où se trouve réellement ce fichier. Lorsque votre client Git souhaite cloner un référentiel ou extraire le fichier, il le télécharge à la place à partir de Git LFS.
Cela signifie que vous n’aurez plus besoin de télécharger chaque objet versionné juste pour cloner le référentiel. LFS accélère la mise en route du référentiel car Git ne se soucie que du pointeur, qui est petit, et ne récupère que les données dont il a besoin.
Le principal inconvénient est que vous ne pouvez plus utiliser les packfiles, ce qui signifie que vous aurez besoin d’un espace de stockage supplémentaire pour chaque copie d’un fichier. Mais, avec LFS vous permettant d’avoir un référentiel massif avec des temps de clonage optimaux, cela n’affecte pas l’expérience du développeur.
Où pouvez-vous utiliser Git LFS ?
Pour l’utiliser, vous aurez besoin d’un serveur configuré pour utiliser Git LFS. C’est juste une extension de Git, vous n’avez donc pas besoin d’installer de logiciel supplémentaire ou de configurer des serveurs pour gérer le stockage des données.
Github prend en charge Git LFS, mais n’autorise que 10 Go par référentiel. Cela s’applique aux repos normaux ainsi qu’aux repos LFS. Cependant, il est assez facile d’acheter plus de données dans Paramètres > Facturation, et 50 Go ne représentent que 4,20 $ de plus par mois :
Vous devrez également payer pour la bande passante, car la mise à jour de fichiers volumineux crée une copie du fichier et doit envoyer le tout.
Si vous souhaitez héberger des référentiels particulièrement volumineux et que vous souhaitez le faire sur votre propre matériel, nous vous recommandons d’utiliser Gitlab auto-hébergé. Vous pouvez lire notre guide sur la configuration d’une instance Gitlab personnelle pour en savoir plus.
Installation et utilisation de Git LFS
Vous devrez télécharger et installer Git LFS à partir de leur site Web.
Ensuite, ouvrez Git ou Git Bash sous Windows et exécutez la commande d’installation pour vérifier que cela fonctionne :
git lfs install
Git LFS fonctionne un peu séparément de Git lui-même. Il ne suit pas automatiquement les fichiers au-dessus d’une certaine taille ; vous devrez ajouter manuellement des fichiers à Git LFS pour commencer à l’utiliser. Vous pouvez utiliser la syntaxe générique pour cela :
git lfs track "*.dat"
Vous pouvez utiliser ls-files
et status
pour afficher l’état du sous-système Git LFS lui-même :
git lfs ls-files git lfs status
Migration vers Git LFS
Si vous venez d’un référentiel Git existant ou si vous avez accidentellement commis quelque chose sans le suivre d’abord dans Git LFS, vous devrez utiliser le migrate
outil pour déplacer les données vers LFS.
Par exemple, en important tous les fichiers existants correspondant à un caractère générique :
git lfs migrate import --include="*.mp4"
Ou tout simplement envoyer le tout à LFS :
git lfs migrate import --everything
Vous devrez peut-être faire git push --force
pour écraser l’historique de la branche.