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?
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)
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.
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.
git lfs ls-files
.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..gitattributes
.git status
.git lfs migrate export --everything --include .
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.git lfs ls-files
.filter=lfs
lignes de TOUS vos .gitattributes
..git/hooks
répertoire: pré-commit, post-commit, post-checkout, post-merge.$GIT_TRACE=1
il ne devrait y avoir aucun signe de ...trace git-lfs: filepathfilter: accepting...