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
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 lfs
installée.