Question Comment puis-je cloner un sous-répertoire uniquement d'un référentiel Git?


J'ai mon dépôt Git qui, à la racine, a deux sous-répertoires:

/finisht
/static

Quand c'était en SVN, /finisht a été vérifié dans un endroit, tandis que /static a été vérifié ailleurs, comme ça:

svn co svn+ssh://admin@domain.com/home/admin/repos/finisht/static static

Y a-t-il un moyen de faire ça avec Git?


999
2018-03-01 16:46


origine


Réponses:


Cette réponse est obsolète et ne s'applique qu'aux versions git inférieures à 1.7.0 (février 2012). Voir ci-dessous pour les versions plus récentes.

Non, ce n'est pas possible dans Git.

Implémenter quelque chose comme ça dans Git serait un effort substantiel et cela signifierait que l'intégrité du référentiel client ne pourrait plus être garantie. Si vous êtes intéressé, recherchez des discussions sur "clone clairsemée" et "clairsemé" sur la liste de diffusion git.

En général, le consensus dans la communauté Git est que si vous avez plusieurs répertoires qui sont toujours vérifiés indépendamment, alors ce sont vraiment deux projets différents et devraient vivre dans deux référentiels différents. Vous pouvez les coller ensemble en utilisant Git Submodules.


421
2018-03-01 18:00



Ce que vous essayez de faire s'appelle un paiement clairsemé, et cette fonctionnalité a été ajoutée dans git 1.7.0 (février 2012). Les étapes pour faire un peu cloner sont les suivants:

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

Cela crée un référentiel vide avec votre télécommande, et récupère tous les objets mais ne les extrait pas. Alors fais:

git config core.sparseCheckout true

Vous devez maintenant définir les fichiers / dossiers que vous souhaitez extraire. Ceci est fait en les listant dans .git/info/sparse-checkout, par exemple:

echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout

Last but not least, mettez à jour votre repo vide avec l'état de la télécommande:

git pull origin master

Vous allez maintenant avoir des fichiers "extraits" pour some/dir et another/sub/tree sur votre système de fichiers (avec ces chemins toujours), et aucun autre chemin présent.

Vous pourriez vouloir jeter un oeil à la tutoriel étendu et vous devriez probablement lire le document officiel documentation pour la vérification clairsemée.

En tant que fonction:

function git_sparse_clone() (
  rurl="$1" localdir="$2" && shift 2

  mkdir -p "$localdir"
  cd "$localdir"

  git init
  git remote add -f origin "$rurl"

  git config core.sparseCheckout true

  # Loops over remaining args
  for i; do
    echo "$i" >> .git/info/sparse-checkout
  done

  git pull origin master
)

Usage:

git_sparse_clone "http://github.com/tj/n" "./local/location" "/bin"

Notez que cela téléchargera tout le dépôt à partir du serveur - seule la taille de la caisse est réduite. Pour l'instant, il n'est pas possible de cloner seulement un seul répertoire. Mais si vous n'avez pas besoin de l'historique du référentiel, vous pouvez au moins économiser sur la bande passante en créant un clone peu profond. Voir La réponse d'udondan ci-dessous pour plus d'informations sur la façon de combiner peu profonde cloner et la caisse clairsemée.


1347
2017-12-06 07:37



Vous pouvez combiner le paiement clairsemé et le clone peu profond fonctionnalités. le clone peu profond coupe l'histoire et la paiement clairsemé ne tire que les fichiers correspondant à vos modèles.

git init <repo>
cd <repo>
git remote add origin <url>
git config core.sparsecheckout true
echo "finisht/*" >> .git/info/sparse-checkout
git pull --depth=1 origin master

Vous aurez besoin d'un minimum de git 1.9 pour que cela fonctionne. Testé moi-même seulement avec 2.2.0 et 2.2.2.

De cette façon, vous serez toujours capable de pousser, ce qui n'est pas possible avec git archive.


325
2018-01-20 07:33



Pour les autres utilisateurs qui je veux juste télécharger un fichier / dossier de github, utilisez simplement:

svn export <repo>/trunk/<folder>

par exemple.

svn export https://github.com/lodash/lodash.com/trunk/docs

(oui, c'est svn ici ... apparemment en 2016 vous avez encore besoin de svn pour télécharger simplement des fichiers github)

Courtoisie: Télécharger un seul dossier ou répertoire à partir d'un dépôt GitHub 

Important - Assurez-vous de mettre à jour l'URL github et de remplacer /tree/master/ avec '/ trunk /'.

Comme script bash:

git-download(){
    folder=${@/tree\/master/trunk}
    folder=${folder/blob\/master/trunk}
    svn export $folder
}

Remarque Cette méthode télécharge un dossier, ne le clone pas / ne l'extrait pas. Vous ne pouvez pas repasser les modifications dans le référentiel. D'un autre côté - cela se traduit par un téléchargement plus petit par rapport à une caisse clairsemée ou à une caisse peu profonde.


77
2017-09-04 13:02



Git 1.7.0 a "caisses clairsemées". Voir "Core.sparseCheckout" dans le git config page de manuel, "Sparse caisse" dans le git-arbre de lecture page de manuel, et "Skip-worktree bit" dans le git update-index page de manuel.

L'interface n'est pas aussi pratique que celle des SVN (par exemple, il n'y a pas moyen de faire une extraction clairsemée lors d'un clonage initial), mais la fonctionnalité de base sur laquelle des interfaces plus simples peuvent être construites est maintenant disponible.


63
2018-05-18 21:15



Si vous ne prévoyez jamais d'interagir avec le référentiel à partir duquel vous avez cloné, vous pouvez effectuer un git clone et réécrivez votre référentiel en utilisant git filter-branch --sous-répertoire-filtre. De cette façon, au moins l'histoire sera préservée.


60
2018-03-01 21:17



Ce semble beaucoup plus simple:

git archive --remote=<repo_url> <branch> <path> | tar xvf -

60
2017-09-10 17:03