cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu
😤 Ce billet a été édité le : 2023-02-24

Migrer un référentiel git utiliser Git Large File Storage pour les fichiers binaires…



Si vous rencontrez cette erreur en poussant un dépôt existant ou un gros fichier sur GitHub par exemple, et que vous avez un message d’insulte comme celui ci-dessous, voici comment configurer le système de stockage de fichiers volumineux (LFS) de git et migrer votre historique git pour prendre en compte ce changement.

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.

Attention, il se peut que le message ne soit pas aussi explicite en fonction du serveur. Par ailleurs, il est préférable de migrer avant d’atteindre ce mur pour des questions de performances.



Installation de l’extension Git LFS

Sous Linux, pour installer l’extension Git LFS, vous devez simplement utiliser :

sudo apt install git-lfs


Configuration de Git LFS votre utilisateur

git lfs install


Attention, l’opération de migration ne doit pas être faite sur un dépôt de développement, vous devez impérativement « cloner » le dépôt spécifiquement pour faire cette opération : Le dossier est devra être détruit après la migration.

Choisir les fichiers qui seront traités par Git LFS

  • Suivre les fichiers par extensions (par type) :
git lfs track "*.zip"
  • Suivre un groupe de fichiers d’après un chemin :
git lfs track "assets/*"
  • Suivre tous les fichiers d’un dossier de manière récursive :

git lfs track "assets/**/*"
  • Suivre un fichier d’après son chemin :
git lfs track "path/to/file"

git lfs track ajoutera les fichiers suivis par Git LFS à .gitattributes. Il est indispensable d’ajouter ensuite .gitattributes à votre dépôt git.

git add .gitattributes

Le suivi des fichiers ne convertit pas automatiquement les fichiers gérés par git depuis votre historique git (et encore moins sur les autres branches).



Attention, l’opération de migration ne doit pas être faite sur un dépôt de développement, vous devez impérativement « cloner » le dépôt spécifiquement pour faire cette opération : Le dossier est devra être détruit après la migration.

Migration de l’histoire d’un dépôt Git

Si vous avez des fichiers existants dans votre historique Git ou dans d’autres branches, vous devez migrer ces fichiers pour qu’ils soient également suivis par Git LFS. Git LFS fournit une commande git lfs migrate avec différentes options permettant de répondre à différentes situations.

Avant d’effectuer votre migration, vous pouvez effectuer un essai avec git lfs migrate info [options].

Utilisez l’option --everything pour effectuer une migration dans chaque branche.

Si vous ne voulez migrer que les fichiers que vous avez ajoutés auparavant avec git lfs track, vous les ajouterez avec l’option --include="*.zip,src/assets" séparés par des virgules.

Voici un exemple qui effectue une migration pour tous les fichiers Zip d’un dépôt :

# Lance un essai de votre migration
git lfs migrate info --everything --include="*.zip"
# Effectue la migration
git lfs migrate import --everything --include="*.zip" --verbose

Maintenant, vous pouvez pousser (git push) votre dépôt vers le serveur.

Notez qu’il vous faudra probablement utiliser l’option --force puisque nous venons de réécrire l’histoire complète du dépôt.

Le processus de migration pouvant être assez long, il est raisonnable de faire cela à un moment où le nombre de branches ouvertes est minimal.

  • Petit script pour aider a la migration (Solution partielle)

    Je vous propose de générer les lignes de commande en tenant compte du contenu de .gitattributes.

    function build_include_value {
      local first="true"
      grep ' filter=lfs diff=lfs merge=lfs -text' .gitattributes |
        cut -d' ' -f1 |
        while read -r line ; do
          if [ "${first}" = 'true' ] ; then
            first='false'
          else
            echo -n ','
          fi
          echo -n "${line}"
        done
    }
    

    Pour essayer la migration :

    git lfs migrate info --everything --include="$( build_include_value)"
    

    Pour effectuer la migration :

    git lfs migrate import --everything --include="$( build_include_value)" --verbose
    


Références permettant d’aller beaucoup plus loin…

ᦿ


ℹ 2006 - 2023 | 🏠 Accueil du domaine | 🏡 Accueil du blog