Slickteam
Published in

Slickteam

Pourquoi et comment utiliser Git LFS ?

Préambule

Explication en GIF du fonctionnement de Git LFS (Source: https://git-lfs.github.com)

Désormais, Git LFS a été adopté par tous les logiciels de systèmes de gestion de Git, que ce soit GitlLab, Bitbucket, etc…

TL;DR

Erreur Git LFS sur GitHub

Installation

Pré-requis

$ git --version

Si vous avez une version suffisante, vous pouvez passer à l’installation de Git LFS.

Debian et Ubuntu
Depuis Debian 10 et Ubuntu 18.04, les OS proposent un package, et l’installation se fait simplement, en trois lignes de commande :

$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash$ sudo apt-get install git-lfs$ git lfs install

Windows
Il suffit de télécharger l’installeur puis de le lancer. Ensuite, il faut exécuter une seule ligne de commande :

$ git lfs install

MacOS
Avec HomeBrew, l’installation se fait en trois commandes également :

$ brew update$ brew install git-lfs$ git lfs install

Ces procédures d’installation ont été prise sur la procédure officielle. Vous trouverez dessus les procédures pour d’autres OS, ou via un Docker Recipe.

Utilisation

Nouveau projet

# directory by path
$ git lfs track "assets/*"
# directory trees
$ git lfs track "assets/**/*"
# one file by path
$ git lfs track "path/to/file.example"
# multiplie files by file type
$ git lfs track "*.tar.gz"

Ensuite, vous remarquerez qu’un fichier nommé .gitattributes a été généré. Si vous l’ouvrez vous verrez que celui-ci contient des informations sur le Git LFS, notamment quels fichiers doivent être traqués par ce système de Large Files. Il ne faudra pas oublier de l’ajouter avec un git add .gitattributes et le commit/push sur le dépôt.

Une fois que vous aurez fait cela, le logiciel de gestion de versions que vous aurez choisi se chargera du reste. Votre projet est prêt à utiliser le Large File Storage !

Projet existant

Le cas ne se présente pas souvent, mais voici un cas où ça peut arriver (c’est exactement ce cas qui m’est arrivé récemment pour un client) :

Un projet a été développé en utilisant une plateforme Git comme par exemple Bitbucket SaaS, et vous devez le migrer pour une raison ou une autre sur une autre plateforme comme GitHub SaaS. De base, toutes les plateformes n’ont pas forcément les mêmes limites de taille maximale pour leurs fichiers avant de devoir passer sur du LFS. Sur des plateformes auto-hébergées, c’est un élément configurable.

Vous saurez très vite s’il doit mettre mis en place, car vous aurez un refus du git push accompagné de ce message d’erreur dans votre console (erreur vue plus haut) :

Erreur Git LFS sur GitHub

La procédure que nous avons suivi pour cette migration a été la suivante :

  • Changement de l’ancien dépôt de code vers le nouveau :
$ git remote set-url origin ${NEW_REPO}

Ceci remplacement l’adresse du dépôt Git de destination. Si vous souhaitez conserver l’ancien repository pour faire une migration “progressive” pour une raison ou une autre, vous pouvez également avoir plusieurs remotes sur le même projet en modifiant origin par le nom de votre choix pour le nouveau remote. Ensuite, il faudra s’assurer de bien garder la cohérence entre les deux dépôts.

  • Reprendre la procédure décrite plus haut pour un l’installation dans un nouveau projet
  • Ensuite, il va falloir vous assurer que les anciens fichiers répondant aux critères de fichier à ajouter au Git LFS soient bien ajoutés. En effet le “track” n’est pas rétroactif, donc si vous traquez les tgz , il faut vous assurer que tous les tgz déjà présents dans l’historique soient bien ajoutés :

Si vous souhaitez vous assurer que vous ne traquerez que les bons fichiers, vous pouvez effectuer un “dry run” de la migration :

$ git lfs migrate info --everything --include="*.tgz"

Une fois que cela est fait et si cela vous convient, vous pouvez lancer la migration (le --verbose étant bien sûr optionnel) :

$ git lfs migrate import --everything --include="*.tgz" --verbose

Cette commande fait un rewrite des anciens commits comportant des fichiers concernés pour que ceux-ci collent avec l’utilisation du Git LFS.

  • (Optionnel) Si vous voulez vous assurer que tous les fichiers voulus ont bien été ajoutés, vous pouvez lister les fichiers ajoutés au système LFS grâce à la commande suivante :
$ git lfs ls-files

/!\ Attention ! Certains logiciels de dépôt de code ont une limite d’utilisation de Git LFS. Par exemple, GitHub a une limite mensuelle gratuite de 1GB de stockage et autant de bande passante par “organisation” ou compte utilisateur, au-delà il faudra payer. Cette jauge (pour GitHub) est visible à cette adresse ou dans la section “settings > billing” de votre organisation. /!\

Il ne faut pas oublier que chaque personne qui interagira sur le projet devra suivre la procédure d’installation de Git LFS sur son environnement.

Résultat

GitHub

Affichage d’un fichier stocké via Git LFS sur GitHub

GitLab

Affichage d’un fichier stocké via Git LFS sur GitLab

À part ce petit point d’information, tout sera totalement transparent pour vous.

Disclaimer

Voici un cas (qui est également ce qui s’est passé dans le projet dont je fais référence plus haut), dans lequel vous ne devriez pas avoir besoin de Git LFS :

Vous avez un projet JavaScript, avec dedans un module personnalisé développé par vous ou par une société tiers ou partenaire. Ce module est privé, et n’est donc pas publié sur le Hub NPM. Dans le projet tel qu’il était fait avant notre reprise, ce module personnalisé était sous format .tar.gz, et celui-ci était appelé dans les dépendances du fichier package.json de la manière suivante :
“modulename”: “file:path/to/filename-version.tar.gz”
Typiquement dans ce cas, vous devriez trouver une alternative plus propre et pérenne pour votre application. En effet, en faisant cela, à la mise à jour de l’application, vous devrez mettre à jour le .tar.gz, et changer la version au fur et à mesure dans le package.json, le versionning n’est pas des plus simples et rapides.
Soit vous publiez votre package sur NPM en mode privé ou sur un Nexus (ou autre) restreint. Soit vous n’avez pas ce genre d’outil dans votre organisation et le publiez directement dans votre gestionnaire de code : ici pour GitHub, ou encore là pour GitLab par exemple. Ainsi, ce package sera directement lié à votre projet et vous aurez tout au même endroit. Cela fonctionne pour les packages NPM, Composer, NuGet, Maven, et d’autres…

Conclusion

--

--

Le Blog — Come as you geek ! 100% technophile & 100% pur beurre une ESN pas comme les autres. www.slickteam.fr — contactez-nous !

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store