Je travaille avec un référentiel avec un très grand nombre de fichiers dont l'extraction prend des heures. J'étudie la possibilité de savoir si Git fonctionnerait bien avec ce type de référentiel maintenant qu'il prend en charge les extractions éparses, mais chaque exemple que je peux trouver fait ce qui suit:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Le problème avec cette séquence de commandes est que le clone d'origine effectue également une extraction. Si vous ajoutez -n à la commande de clonage d'origine, la commande read-tree génère l'erreur suivante:
erreur: l'extraction éparse ne laisse aucune entrée sur le répertoire de travail
Comment faire l'extraction parcimonieuse sans avoir d'abord extrait tous les fichiers?
git worktree add --no-checkout
fonctionnera aussi (pas seulementgit clone --no-checkout
) avec git 2.9 (juste 2016). Voir ma réponse ciRéponses:
En 2020, il existe un moyen plus simple de gérer les extractions éparses sans avoir à se soucier des fichiers .git. Voici comment je l'ai fait:
Notez qu'il nécessite l'installation de la version 2.25 de git. En savoir plus ici: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
METTRE À JOUR:
La
git clone
commande ci-dessus clonera toujours le dépôt avec son historique complet, mais sans extraire les fichiers. Si vous n'avez pas besoin de l'historique complet, vous pouvez ajouter le paramètre --depth à la commande, comme ceci:la source
sparse-checkout --cone
fonctionnalité dans stackoverflow.com/a/59515426/6309--filter
) à votre réponse ici.--depth
paramètre qui nous permet de faire un clone superficiel. Cela aidera-t-il? @Tao, je ne sais pas comment utiliser--filter
dans ce cas, je ne l'ai pas essayé. Pourriez-vous donner un exemple ou publier une autre réponse à ce sujet?Veuillez noter que cette réponse télécharge une copie complète des données à partir d'un référentiel. La
git remote add -f
commande clonera tout le référentiel. Depuis la page de manuel degit-remote
:Essaye ça:
Vous constaterez maintenant que vous avez une extraction "élaguée" avec uniquement les fichiers de chemin / within_repo / vers / souhaité_subdir présents (et dans ce chemin).
Notez que sur la ligne de commande Windows vous ne devez pas citer le chemin, c'est à dire que vous devez changer la 6ème commande avec celle-ci:
si vous ne le faites pas, vous obtiendrez les guillemets dans le fichier de retrait épars, et cela ne fonctionnera pas
la source
git remote add
commande télécharge tout parce que c'est ce qui-f
fait - lui dit de récupérer immédiatement, avant que vous ayez défini les options d'extraction éparses. Mais omettre ou réorganiser cela ne va pas aider. Les extractions éparses n'affectent que l'arborescence de travail, pas le référentiel. Si vous souhaitez que votre référentiel adopte un régime à la place, vous devez plutôt regarder les options--depth
ou--single-branch
.Git clone a une option (
--no-checkout
ou-n
) qui fait ce que vous voulez.Dans votre liste de commandes, changez simplement:
Pour ça:
Vous pouvez ensuite utiliser la caisse clairsemée comme indiqué dans la question.
la source
--depth <depth>
option sur git clone. Cela ne téléchargera que les derniers<depth>
commits de l'historique. Actuellement, il n'y a aucun moyen de télécharger partiellement un seul commit avec git, mais si votre télécommande le prend en charge, vous pouvez l'utilisergit archive --remote
pour télécharger des ensembles partiels de fichiers.J'ai eu un cas d'utilisation similaire, sauf que je voulais extraire uniquement le commit d'une balise et élaguer les répertoires. L'utilisation
--depth 1
rend les choses vraiment rares et peut vraiment accélérer les choses.la source
J'ai trouvé la réponse que je cherchais dans le one-liner posté plus tôt par pavek (merci!) Donc je voulais fournir une réponse complète en une seule réponse qui fonctionne sous Linux (GIT 1.7.1):
J'ai un peu changé l'ordre des commandes mais cela ne semble pas avoir d'impact. La clé est la présence de la barre oblique de fin "/" à la fin du chemin à l'étape 5.
la source
Malheureusement, aucune de ces solutions n'a fonctionné pour moi, alors j'ai passé très longtemps à essayer différentes combinaisons de
sparse-checkout
fichiers.Dans mon cas, je voulais ignorer les dossiers avec les configurations IntelliJ IDEA.
Voici ce que j'ai fait:
Courir
git clone https://github.com/myaccount/myrepo.git --no-checkout
Courir
git config core.sparsecheckout true
Créé
.git\info\sparse-checkout
avec le contenu suivantExécutez 'git checkout -' pour obtenir tous les fichiers.
La chose essentielle pour le faire fonctionner était d'ajouter
/*
après le nom du dossier.J'ai git 1.9
la source
Oui, possibilité de télécharger un dossier au lieu de télécharger tout le référentiel. Même tout / dernier commit
Belle façon de faire ça
-r HEAD téléchargera uniquement la dernière révision, ignore tout l'historique.
Remarque tronc et / dossier spécifique
Copiez et modifiez l'URL avant et après
/trunk/
. J'espère que cela aidera quelqu'un. Prendre plaisir :)Mis à jour le 26 sept. 2019
la source
Réponse mise à jour 2020:
Il y a maintenant une commande
git sparse-checkout
, que je présente en détail avec Git 2.25 (Q1 2020)La réponse de nicono illustre son utilisation:
Il a évolué avec Git 2.27 et sait comment "réappliquer" une extraction éparse, comme ici .
Notez qu'avec Git 2.28,
git status
mentionnera que vous êtes dans un référentiel extrait de manière fragmentéeRéponse originale: 2016
git 2.9 (juin 2016) généralisera l'
--no-checkout
option àgit worktree add
(la commande qui permet de travailler avec plusieurs arbres de travail pour un dépôt )Voir commit ef2a0ac (29 mars 2016) par Ray Zhang (
OneRaynyDay
) .Aide: Eric Sunshine (
sunshineco
) et Junio C Hamano (gitster
) .(Fusionné par Junio C Hamano -
gitster
- in commit 0d8683c , 13 avril 2016)La
git worktree
page de manuel comprend désormais:la source
Étapes à suivre pour extraire uniquement un dossier spécifique:
la source
Sur la base de cette réponse d' apenwarr et de ce commentaire de Miral, j'ai proposé la solution suivante qui m'a permis d'économiser près de 94% d'espace disque lors du clonage local du référentiel linux git tout en ne voulant qu'un sous-répertoire de documentation:
Je suis donc passé de 2,9 Go à 182 Mo, ce qui est déjà très agréable.
Je n'ai cependant pas réussi à faire fonctionner cela
git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test
( suggéré ici ) car les fichiers manquants ont tous été ajoutés en tant que fichiers supprimés à l'index. Donc, si quelqu'un connaît l'équivalent degit clone --filter=blob:none
forgit fetch
, nous pouvons probablement économiser encore plus de mégaoctets. (La lecture de la page de manuel degit-rev-list
indique également qu'il existe quelque chose comme--filter=sparse:path=…
, mais je n'ai pas réussi à faire fonctionner cela non plus.(Tous ont été essayés avec git 2.20.1 de Debian Buster.)
la source
--filter=sparse:path=…
plus.Je suis nouveau sur git mais il semble que si je fais git checkout pour chaque répertoire, cela fonctionne. En outre, le fichier d'extraction éparse doit avoir une barre oblique à la fin de chaque répertoire, comme indiqué. Quelqu'un de plus d'expérience, veuillez confirmer que cela fonctionnera.
Fait intéressant, si vous extrayez un répertoire qui ne se trouve pas dans le fichier d'extraction éparse, cela ne semble pas faire de différence. Ils n'apparaissent pas dans l'état git et git read-tree -m -u HEAD ne le supprime pas. git reset --hard n'entraîne pas non plus la suppression du répertoire. Quelqu'un de plus expérimenté voudrait commenter ce que Git pense des répertoires qui sont extraits mais qui ne sont pas dans le fichier d'extraction clairsemé?
la source
Dans git 2.27, il semble que git sparse checkout ait évolué. La solution dans cette réponse ne fonctionne pas exactement de la même manière (par rapport à git 2.25)
Ces commandes fonctionnaient mieux:
Voir aussi: git-clone --sparse et git-sparse-checkout add
la source
Dans mon cas, je souhaite ignorer le
Pods
dossier lors du clonage du projet. Je l'ai fait étape par étape comme ci-dessous et cela fonctionne pour moi. J'espère que ça aide.Mémo, si vous voulez sauter plus de dossiers, ajoutez simplement plus de ligne dans le fichier de retrait clairsemé.
la source