web-dev-qa-db-fra.com

Que fait git lfs migrate?

Je pensais que git lfs migrate a réécrit l'historique d'un dépôt afin que les gros fichiers spécifiés soient conservés dans LFS. Cela signifie que le dépôt devrait devenir plus petit, car il ne contient pas directement toutes les versions de fichiers volumineux. Cependant, quand je cours

git lfs migrate import --include="test-data/**" --include-ref=refs/heads/master

Tous les fichiers du test-data/ le répertoire est remplacé par des fichiers qui ressemblent à ceci:

version https://git-lfs.github.com/spec/v1
oid sha256:5853b5a2a95eaca53865df996aee1d911866f754e6089c2fe68875459f44dc55
size 19993296

Et le dossier .git devient deux fois plus volumineux (400 Mo à 800 Mo). Je suis confus. Qu'est-ce que git lfs migrate doing?

Edit: je l'ai fait nettoyer après la migration

git reflog expire --expire-unreachable=now --all
git gc --Prune=now

avant d'exécuter du. Ensuite, la majeure partie de l'espace est utilisée par ces dossiers:

414M .git/objets 398M .git/lfs

6
Mohan

Je pensais que git lfs migrate a réécrit l'historique d'un dépôt afin que les gros fichiers spécifiés soient conservés dans LFS.

Parfaitement vrai.

Cela signifie que le dépôt devrait devenir plus petit, car il ne contient pas directement toutes les versions de fichiers volumineux.

Pas exactement vrai. La promesse de git lfs n'est pas que votre référentiel sera plus petit mais que lorsque vous clonerez, vous n'aurez pas à télécharger tous les objets git donc le clone sera plus petit et plus rapide. Parce que pour le fichier géré par git-lfs, seuls les fichiers qui devraient apparaître dans votre répertoire de travail seront téléchargés pendant le git checkout.

Tous les fichiers du répertoire test-data/sont remplacés par des fichiers qui ressemblent à ceci:

Voilà comment fonctionne git-lfs. Au lieu de valider le fichier dans le référentiel, il valide un fichier "pointeur" qui contient l'identifiant de l'objet. Le contenu du fichier est stocké dans le .git/lfs/objects dossier. Et ces objets seront téléchargés sur le serveur lorsque vous git Push.

Et le dossier .git devient deux fois plus volumineux (400 Mo à 800 Mo). Je suis confus.

Parce que tous les fichiers gérés par git lfs sont stockés dans ce dossier, cela pourrait devenir énorme. Je pense également que cela double la taille de votre référentiel car les objets sont stockés deux fois pour le moment. Dans le .git/objects jusqu'à ce que vous abandonniez l'ancienne histoire (en purgeant le reflog et en faisant un git gc . Mais faites-le une fois que vous êtes sûr que votre migration lfs est un succès) et dans .git/lfs/objects car vous avez effectué la conversion git lfs.

Je pense (mais je ne suis pas sûr) que .git/lfs/objects servir de dossier de cache donc une fois que vous avez poussé tout le nouvel historique et donc qu'il a téléchargé les fichiers gérés par lfs, vous pouvez le supprimer pour réduire la taille de votre référentiel. Mais si j'étais vous, je ne ferai pas ça!

Pour voir l'effet réel de git lfs sur votre référentiel local, une fois que vous --force a poussé la nouvelle histoire (et que l'ancienne n'est plus dans le dépôt distant), je vais faire un nouveau clone. Et maintenant, votre référentiel local devrait être plus petit.

Mais le dossier .git/lfs/objects continuera de croître à l'avenir chaque fois qu'une nouvelle version de ces fichiers sera téléchargée (mais elle devrait toujours rester plus petite que si vous n'utilisiez pas git lfs).

J'espère que vous comprendrez mieux comment cela fonctionne ...

PS:

Tous les fichiers du répertoire test-data/sont remplacés par des fichiers qui ressemblent à ceci:

J'espère que ce que vous avez dit est partiellement faux. Que vos fichiers dans test-data/ contient toujours le bon contenu mais ce que vous signalez est ce qu'une commande git vous montre ... Pourriez-vous confirmer? Ou vous avez un problème ... Cela pourrait s'expliquer par l'absence de git lfsinstallée.

3
Philippe