cClaude.rocks ☕ Le blog

[Nouvelles technologies du libre, 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 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog