web-dev-qa-db-fra.com

Comment désactiver git-lfs?

J'ai un référentiel sur bitbucket qui utilise LFS. Depuis que je l'utilise depuis un certain temps, j'ai décidé de déplacer le référentiel vers un espace sous mon contrôle. La seule raison pour laquelle j'ai utilisé LFS en premier lieu était de doubler efficacement la limite de taille de mon référentiel (car les fichiers dans LFS vont dans un compartiment séparé) mais maintenant je le déplace, je n'ai plus besoin de le faire.

J'ai besoin d'un moyen de parcourir l'ensemble de l'historique de git, en supprimant toutes les traces du travail que git LFS fait (donc tous les fichiers sont validés `` normalement ''). Une fois cela fait, j'ai l'intention de forcer Push vers le nouveau référentiel.

J'ai fait pas mal de recherches et je suis tombé sur solutions suggérées mais je ne comprends pas comment les implémenter/les exécuter car elles sont de haut niveau.

Comment dire au revoir à git LFS?

10
Shadow

Mettre à jour la validation actuelle uniquement

Si vous souhaitez quitter LFS, mais que vous n'êtes pas si inquiet de réparer l'intégralité de l'historique git, vous pouvez effectuer les opérations suivantes;

git lfs uninstall
touch **/*
git commit -a

Cela désinstallera le support LFS, touchera chaque fichier (afin que git reconnaisse qu'il a changé) puis les validera tous. Si vous le souhaitez, vous pouvez être plus précis (par exemple, **/*.png par exemple). Notez que l'utilisation de ** nécessite une prise en charge globale étendue activée (shopt -s globstar sur bash)

Mettre à jour l'historique complet

Cela a fonctionné pour moi - mais cela génère de nombreuses erreurs (je pense je reçois une erreur pour chaque commit dans lequel un fichier n'a pas été ajouté à LFS) et prend beaucoup de temps (environ 2 -3 secondes par commit).

git lfs uninstall
git filter-branch -f --Prune-empty --tree-filter '
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs touch
  git rm -f .gitattributes
  git lfs ls-files | cut -d " " -f 3 | git add
' --tag-name-filter cat -- --all

Il désinstalle le support de git LFS (empêchant théoriquement LFS de jouer avec l'index) puis pour chaque commit il s'assure que les fichiers LFS sont extraits correctement, puis les touche tous (donc git se rend compte qu'ils ont changé), supprime les paramètres pour LFS trouvés dans .gitattributes afin que lors du clonage, il n'essaie pas d'utiliser LFS, puis ajoute le fichier réel à l'index.

Après avoir fait ce qui précède, vous devrez effectuer une poussée forcée. Naturellement, cela mettra toute autre personne travaillant sur votre dépôt dans un état de tête détachée - il est donc sage de le faire pendant un gel de code. Par la suite, il est probablement plus facile d'amener tout le monde à faire un nouveau clone.

13
Shadow

git lfs migrate export

De git lfs migrate help:

Exportation

Le mode export migre les fichiers de pointeurs Git LFS présents dans l'historique Git hors de Git LFS, les convertissant en leurs fichiers objets correspondants.

Exemple de workflow

  1. Vérifiez que vous disposez réellement de fichiers LFS avec git lfs ls-files.
  2. Enlever tout filter=lfs lignes de TOUTES les .gitattributes fichiers dans votre référentiel. .gitattributes peut vivre n'importe où, alors assurez-vous de les trouver tous sinon cela peut entraîner des problèmes de migration plus tard.
  3. Validez toutes les modifications que vous avez apportées à .gitattributes.
  4. Assurez-vous que vous n'avez aucun changement avec git status.
  5. Exécutez la migration: git lfs migrate export --everything --include .
  6. Courir git status pour vous assurer que vous n'avez aucun changement. Si vous avez quitté .gitattributes avec filter=lfs vous pourriez avoir des modifications incorrectes maintenant.
  7. Vérifiez que tous les fichiers LFS précédemment répertoriés ne sont plus présents avec git lfs ls-files.
  8. Inspectez les fichiers (par exemple, ouvrez les anciens fichiers LFS pour vous assurer qu'ils ne sont pas corrompus) et exécutez votre génération pour vous assurer que tout fonctionne.

Conseils

  • Exécuter sur un système de fichiers sensible à la casse, au cas où vous auriez des collisions de système de fichiers (par exemple ./LICENSE et ./License) à un moment donné.
  • Débarrassez-vous de tous vos filter=lfs lignes de TOUS vos .gitattributes.
  • Vous pouvez également supprimer les restes LFS dans .git/hooks répertoire: pré-commit, post-commit, post-checkout, post-merge.
  • Avec $GIT_TRACE=1 il ne devrait y avoir aucun signe de ...trace git-lfs: filepathfilter: accepting...
7
Doug Richardson