Télécharger un seul dossier ou répertoire à partir d'un référentiel GitHub

1106

Comment puis-je télécharger uniquement un dossier ou un répertoire spécifique à partir d'un référentiel Git distant hébergé sur GitHub?

Dites l'exemple du dépôt GitHub ici:

[email protected]:foobar/Test.git

Sa structure de répertoires:

Test/
├── foo/ 
│   ├── a.py
│   └── b.py   
└── bar/
    ├── c.py
    └── d.py

Je souhaite télécharger uniquement le dossier foo et ne pas cloner l'intégralité du projet Test.

g_inherit
la source
4
J'ai écrit un script shell pour cela en utilisant svn checkout - github.com/Decad/github-downloader
Declan Cook
391
Quelqu'un peut-il m'expliquer pourquoi il n'y a pas de solution d'interface Web "officielle" à cela? Cela semble être une fonctionnalité triviale à mettre en œuvre, mais super utile.
Alexander - Reinstate Monica
3
J'ai développé une extension chrome en utilisant le gitzip de KinoLien. github.com/charany1/GHSDD
charany1
3
voir @janos répondre svn alternative est la meilleure, pas d'authentification, pas d'inscription, pas de limite, pas de plugins
stackdave
5
J'ai fait une solution légère pour cela ( download-directory.github.io ) et elle est intégrée dans Refined GitHub
fregante

Réponses:

1039

Mise à jour sept. 2016: quelques outils créés par la communauté peuvent le faire pour vous:


Git ne le supporte pas, mais Github le fait via SVN. Si vous extrayez votre code avec subversion, Github convertira essentiellement le dépôt de git en subversion sur le backend, puis servira le répertoire demandé.

Voici comment vous pouvez utiliser cette fonction pour télécharger un dossier spécifique. Je vais utiliser la bibliothèque javascript populaire lodashcomme exemple.

  1. Accédez au dossier que vous souhaitez télécharger . Téléchargeons /testdepuis la masterbranche. exemple d'URL de dépôt github

  2. Modifiez l'URL de subversion . Remplacez tree/masterpar trunk.

    https://github.com/lodash/lodash/tree/master/test

    https://github.com/lodash/lodash/trunk/test

  3. Téléchargez le dossier . Accédez à la ligne de commande et récupérez le dossier avec SVN.

svn checkout https://github.com/lodash/lodash/trunk/test

Vous ne verrez peut-être aucune activité immédiatement, car Github prend jusqu'à 30 secondes pour convertir des référentiels plus importants, alors soyez patient.

Explication complète du format d'URL:

  • Si vous êtes intéressé par la masterbranche, utilisez trunkplutôt. Donc, le chemin complet esttrunk/foldername
  • Si vous êtes intéressé par la foobranche, utilisez branches/fooplutôt. Le chemin complet ressemble àbranches/foo/foldername
  • Protip: vous pouvez utiliser svn lspour voir les balises et les branches disponibles avant le téléchargement si vous le souhaitez

C'est tout! Github prend également en charge davantage de fonctionnalités de subversion , y compris la prise en charge des modifications et des modifications.

pseudo
la source
162
Génial, remplacez simplement tree/masterpar trunket vous pouvez obtenir le dossier spécifique.
Sérgio Michels
6
Merci @ user1146881 et @ SérgioMichels, vous devez remplacer tree/masterpar trunk. Cette information doit être ajoutée en réponse.
baptx
8
J'ai modifié cela pour l'utiliser svn export, car je ne voulais pas de copie de travail Subversion. Ensuite, j'ai ajouté le dossier résultant dans Git. (J'ai en quelque sorte perdu une grande partie de mon arborescence de répertoires, j'ai donc exporté à partir du dépôt que j'ai bifurqué.)
Grault
5
@ num3ric- désolé pour la réponse tardive, mais vous devriez pouvoir remplacer "trunk" par "branches / yourbranch"
nick
2
@ElijahLynn Merci pour la modification, j'aurais dû inclure cette information! 2 choses cependant - j'ai accepté votre montage mais j'ai annulé certains des miens (cela signifiait faire ça de toute façon, c'était trop compliqué). De plus, j'ai changé votre branchchemin vers branches, ce que je pense est correct; sinon, allez-y et changez-le.
nick
568

Deux options pour cette fonctionnalité:

Option 1: extension de navigateur GitZip

Extension Chrome , module complémentaire Firefox

Usage:

  1. Dans n'importe quelle page de référentiel GitHub.
  2. Double-cliquez simplement sur la partie vierge des éléments dont vous avez besoin.
  3. Cliquez sur le bouton de téléchargement en bas à droite.
  4. Consultez le tableau de bord de progression et attendez le téléchargement du déclencheur du navigateur.
  5. Obtenez le fichier ZIP.

Obtenez un jeton:

  1. Cliquez sur l'icône de l'extension GitZip sur votre navigateur.
  2. Cliquez sur le lien "Normal" ou "Privé" à côté de "Obtenir le jeton".
  3. Autorisez l'autorisation GitZip sur la page d'authentification Github.
  4. Retour à la page repo du début.
  5. Continuez à utiliser.

Option 2: page gh de Github

http://kinolien.github.io/gitzip en utilisant l'API GitHub et les bibliothèques JSZip, FileSaver.js.

Étape 1: Entrez l'url de github dans le champ en haut à droite.
Étape 2: Appuyez sur Entrée ou cliquez directement sur Télécharger pour télécharger le zip directement ou cliquez sur Rechercher pour afficher la liste des sous-dossiers et des fichiers.
Étape3: Cliquez sur "Télécharger le fichier Zip" ou "Obtenir le fichier" pour obtenir les fichiers.

Dans la plupart des cas, cela fonctionne correctement, sauf que le dossier contient plus de 1 000 fichiers, en raison de la limitation de l'API Github Trees. (fait référence au contenu de l'API Github # )

Et il peut également prendre en charge les dépôts privés / publics et mettre à niveau la limite de taux, si vous avez un compte GitHub et utilisez le lien "get token" sur ce site.

Kino
la source
5
C'est génial, mais on dirait que c'est tellement génial que la demande vous pousse au-dessus de votre limite de rat et donc que cela ne fonctionne plus ;-) Ce serait génial de pouvoir vous connecter avec GitHub oAuth - qui permettrait le support du repo privé, et aussi incréerait votre limite de taux car ils seraient des demandes authentifiées
hobailey
3
@hobailey Maintenant, il peut obtenir un jeton d'accès pour augmenter la limite de débit, et également accéder aux dépôts privés.
Kino
1
@MYounas Voir à propos des chapitres OAuth, Trees, Blobs dans Github API Doc. et également utiliser les bibliothèques JSZip, FileSaver.js js pour l'implémentation de Gitzip.
Kino
1
Est-ce que quelqu'un serait intéressé par une extension Chrome qui fait cela?
goldylucks
4
Cela doit vraiment être ajouté au site Web réel de Github, c'est extrêmement utile.
roule
509

Allez dans DownGit > Entrez votre URL> Télécharger!

Maintenant, vous pouvez TÉLÉCHARGER DIRECTEMENT ou créer un LIEN DE TÉLÉCHARGEMENT pour n'importe quel répertoire ou fichier public GitHub (fichier particulièrement volumineux ) à partir de DownGit ! Voici une démonstration simple-


DownGit


Vous pouvez également configurer l' utilisation détaillée des propriétés du fichier téléchargé .

Minhas Kamal
la source
2
Bro, je veux dire comment créer un projet comme DownGit que vous avez créé.
Muhammad Younus
12
La méthode de base est- 1. prendre le lien du répertoire ( route angulaire utilisée ), 2. aller à l' API GitHub , 3. rechercher dans le répertoire et télécharger tous les fichiers, 4. créer un fichier zip avec lui (j'ai utilisé jszip ) et l' enregistrer sous forme de fichier (utilisé FileSaver pour cela). Pour une compréhension claire, je suggère de jeter un œil à mon projet .
Minhas Kamal
1
merci Bro pour des instructions détaillées, je vous suis très reconnaissant si vous suggérez un tutoriel ou un lien.
Muhammad Younus
5
C'est cool mais cela ne fonctionne pas avec des outils automatisés (comme wget)
Ring
1
Cela se bloque downloaded 25 of 25 fileslorsque j'essaie de télécharger à partir de cette URL: github.com/dssg/hitchhikers-guide/tree/master/curriculum/…
Wassadamo
164

Si c'est le cas svn, vous pouvez utiliser svn exportpour cela:

svn export https://github.com/foobar/Test.git/trunk/foo

Remarquez le format URL:

  • L'URL de base est https://github.com/
  • /trunk annexé à la fin

Avant de vous lancer svn export, il est bon de vérifier d'abord le contenu du répertoire avec:

svn ls https://github.com/foobar/Test.git/trunk/foo
janos
la source
Est-ce que cela fonctionne toujours? J'ai essayé cela avec TortiseSVN et j'obtiens une erreur d'autorisation, me demandant de fournir des informations d'identification.
john
2
@john Je suis sûr que c'est trop tard pour être d'une grande aide, mais avez-vous activé l'authentification à 2 facteurs sur votre compte GitHub? Si c'est le cas, je pense avoir lu quelque part, vous devrez utiliser une clé pré-générée pour le mot de passe (que vous devrez trouver dans les paramètres de GitHub).
nick
1
Concernant la mise en forme des URL, vous pouvez conserver l' .gitextension. Vous pouvez utiliser le lien du projet complet et commencer par utiliser svn lssuivi du chemin complet du projet. Exemple: svn ls https://github.com/RobTillaart/Arduino.git. Pour exporter un seul dossier, il vous suffit d'ajouter le /trunksuivi du chemin souhaité, comme svn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib. Il est plus facile de conserver le chemin du projet intact.
jgrocha
@jgrocha Je ne suis pas sûr que cela ait fonctionné de cette façon en 2013, mais il le fait maintenant, alors merci, a mis à jour le post
janos
1
Un exemple: pour télécharger le contenu dans https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi, exécutez svn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi. Un répertoire appelé wsgisera créé sous le répertoire de travail actuel. Seuls les fichiers source, rien d'autre. Non .git, pas de fichiers liés à la subversion.
Rockallite
74

Pour un dépôt git générique:

Si vous souhaitez télécharger des fichiers, pas cloner le référentiel avec l'historique, vous pouvez le faire avec git-archive.

git-archivecrée une archive compressée zip ou tar d'un référentiel git. Certaines choses qui le rendent spécial:

  1. Vous pouvez choisir les fichiers ou répertoires du référentiel git à archiver.
  2. Il .git/n'archive pas le dossier ou les fichiers non suivis dans le référentiel sur lequel il est exécuté.
  3. Vous pouvez archiver une branche, une balise ou un commit spécifique. Les projets gérés avec git l'utilisent souvent pour générer des archives des versions du projet (beta, release, 2.0, etc.) que les utilisateurs peuvent télécharger.

Un exemple de création d'une archive du docs/usagerépertoire à partir d'un référentiel distant auquel vous êtes connecté avec ssh:

# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar

Plus d'informations dans cet article de blog et la documentation de git .

Remarque sur les dépôts GitHub:

GitHub ne permet pas l' git-archiveaccès . ☹️

RobW
la source
2
git archive --format tarle format n'est pas tar.gz, mais tar.
出 羽 和 之
Cela devrait être la meilleure réponse
Felipe Costa
2
Je pense que c'est la meilleure réponse, mais notez que la commande git archive ne fonctionne pas avec le protocole https.
bitfox
@yukihane a modifié l'extension de tar.gz à tar, espérons que OP est à bord avec cela
mihai
36

J'ai créé un projet open source, appelé GitHubFolderDownloader . Il vous permet de télécharger un seul dossier d'un référentiel sans clonage ni téléchargement de l'ensemble du référentiel.

VahidN
la source
Fonctionne très bien si vous avez seulement besoin de télécharger des dossiers depuis GitHub. Il suffit d'un jeton Github pour télécharger le dossier souhaité. Plus de votes positifs pourraient donner à cette réponse une certaine importance.
Alex Essilfie
34

Rien de mal avec les autres réponses mais je pensais juste partager des instructions étape par étape pour ceux qui se promènent dans ce processus pour la première fois.

Comment télécharger un seul dossier à partir d'un référentiel github (Mac OS X):

~ Pour ouvrir Terminal, cliquez simplement sur Spotlight et tapez Terminal, puis appuyez sur Entrée

  1. Sur un Mac, vous avez probablement déjà SVN (pour tester simplement le terminal ouvert et tapez "svn" ou "which svn" ~ sans les guillemets)
  2. Sur Github: localisez le chemin Github vers votre dossier git (pas le dépôt) en cliquant sur le nom du dossier spécifique dans un dépôt
  3. Copiez le chemin depuis la barre d'adresse du navigateur
  4. Ouvrez Terminal et tapez: svn export
  5. Collez ensuite l'adresse (par exemple.): Https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. Remplacer les mots: arbre / maître
  7. avec le mot: tronc
  8. Tapez le dossier de destination pour les fichiers (dans cet exemple, je stocke le dossier cible à l'intérieur du dossier Téléchargements pour l'utilisateur actuel)
  9. Ici, l'espace n'est que la barre d'espace et non le mot (espace) ~ / Téléchargements / HeadsUpUI
  10. La commande finale du terminal affiche la commande complète pour télécharger le dossier (comparer l'adresse à l'étape 5) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~ / Downloads / HeadsUpUI

BTW - Si vous êtes sous Windows ou sur une autre plate-forme, vous pouvez trouver un téléchargement binaire de subversion (svn) sur http://subversion.apache.org

~ Si vous souhaitez extraire le dossier plutôt que de simplement le télécharger, essayez d'utiliser l'aide svn (tldr: remplacez l' exportation par l' extraction )

Mise à jour

Concernant le commentaire sur la reprise d'un téléchargement / paiement interrompu. J'essaierais de courir svn cleanupsuivi de svn update. Veuillez rechercher SO pour des options supplémentaires.

Tommie C.
la source
1
Je dois télécharger de nombreux fichiers à partir d'un dossier spécifique et j'ai obtenu cette erreur au milieu du téléchargement: svn: E175002: RAPPORT de '/ bgmartins / scripts-parlamento /! Svn / vcc / default': 200 OK ( github.com ) Comment pouvez-vous reprendre le téléchargement?
Miguel
A travaillé pour moi. C'est incroyable.
Heath Raftery
24

Quiconque travaille sur un dossier spécifique dont il a besoin pour cloner ce dossier particulier lui-même, pour ce faire, veuillez suivre les étapes ci-dessous en utilisant la vérification clairsemée.

  1. Créez un répertoire.

  2. Initialisez un référentiel Git. ( git init)

  3. Activez les extractions clairsemées. ( git config core.sparsecheckout true)

  4. Indiquez à Git les répertoires que vous souhaitez (echo 2015 / brand / May (reportez-vous au dossier sur lequel vous souhaitez travailler) >> .git/info/sparse-checkout)

  5. Ajoutez la télécommande ( git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)

  6. Récupérer les fichiers ( git pull origin master)

Mohammed Jafar
la source
Dommage que ce commentaire n'ait pas obtenu assez de votes positifs. Il semble que la solution fournie s'applique à tous les référentiels git et pas seulement à celui de github.
Kalyan
9
Cependant, cela ne fait pas ce qui était souhaité. Il clone toujours l'ensemble du référentiel, il ne vérifie tout simplement pas certains dossiers.
Chris
J'obtiens cette erreur: la vérification clairsemée ne laisse aucune entrée dans le répertoire de travail
orangecaterpillar
20

Vous ne pouvez pas; contrairement à Subversion, où chaque sous-répertoire peut être extrait individuellement, Git fonctionne sur la base d'un référentiel complet.

Pour les projets où un accès plus fin est nécessaire, vous pouvez utiliser des sous-modules - chaque sous-module est un projet Git distinct, et peut donc être cloné individuellement.

Il est concevable qu'un frontal Git (par exemple l'interface Web de GitHub, ou gitweb) puisse choisir de fournir une interface pour vous permettre d'extraire un dossier donné, mais à ma connaissance aucun ne le fait (bien qu'ils vous permettent de télécharger des fichiers individuels , donc si le dossier ne contient pas trop de fichiers, c'est une option)

Edit - GitHub offre en fait un accès via SVN, ce qui vous permettrait de faire exactement cela (selon le commentaire). Voir https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away pour les dernières instructions sur la façon de procéder

michel-slm
la source
y a-t-il quelque chose via l'API github?
g_inherit
14

Si vous voulez vraiment simplement "télécharger" le dossier et non le "cloner" (pour le développement), la manière la plus simple d'obtenir simplement une copie de la version la plus récente du référentiel (et donc un dossier / fichier qu'il contient), sans avoir besoin de cloner l'intégralité du référentiel ou même d'installer git en premier lieu, consiste à télécharger une archive zip (pour tout référentiel, fork, branche, commit, etc.) en allant dans le référentiel / fork / branch / commit souhaité sur GitHub (par exemple http(s)://github.com/<user>/<repo>/commit/<Sha1>pour une copie des fichiers tels qu'ils étaient après un commit spécifique) et en sélectionnant le Downloadsbouton en haut à droite.

Ce format d'archive ne contient aucune magie de git-repo, juste les fichiers suivis eux-mêmes (et peut-être quelques fichiers .gitignore s'ils ont été suivis, mais vous pouvez les ignorer: p) - cela signifie que si le code change et que vous voulez restez au top, vous devrez le télécharger à nouveau manuellement, et cela signifie également que vous ne pourrez pas l'utiliser comme référentiel git ...

Je ne sais pas si c'est ce que vous recherchez dans ce cas (encore une fois, "télécharger" / afficher vs "cloner" / développer), mais cela peut néanmoins être utile ...

johnny
la source
9
Si vous ne voyez pas de lien de téléchargement, assurez-vous que vous êtes sur une page principale du référentiel (pas un répertoire enfant.) Il semble que vous ne pouvez télécharger qu'un zip de l'ensemble du référentiel. De plus, cette page d'aide de github pourrait être utile.
JD Smith
2
Accès facile par pointer-cliquer. Facile à obtenir une version antérieure. Facile à extraire le dossier souhaité du zip téléchargé. Je vous remercie.
Andy Thomas
1
L'URL générique pour obtenir le téléchargement à partir de tar.gz:https://github.com/${owner}/${repo}/archive/${hash}.tar.gz
Krisztian
11

Résumé 2019

Il existe différentes manières de gérer cela, selon que vous souhaitez ou non effectuer cette opération manuellement ou par programme.

Il existe quatre options résumées ci-dessous. Et pour ceux qui préfèrent une explication plus pratique, j'ai mis en place une vidéo YouTube: Télécharger des fichiers et des dossiers individuels depuis GitHub .

De plus, j'ai publié une réponse similaire sur StackOverflow pour ceux qui ont besoin de télécharger des fichiers uniques depuis GitHub (par opposition aux dossiers).


1. Interface utilisateur GitHub

  • Il y a un bouton de téléchargement sur la page d'accueil du référentiel. Bien sûr, cela télécharge le référentiel entier, après quoi vous devrez décompresser le téléchargement, puis faire glisser manuellement le dossier spécifique dont vous avez besoin.

2. Outils tiers

  • Il existe une variété d'extensions de navigateur et d'applications Web qui peuvent gérer cela, avec DownGit étant l'un d'entre eux. Collez simplement l'URL GitHub dans le dossier (par exemple https://github.com/babel/babel-eslint/tree/master/lib) et appuyez sur le bouton "Télécharger".

3. Subversion

  • GitHub ne prend pas en charge git-archive (la fonctionnalité git qui nous permettrait de télécharger des dossiers spécifiques). GitHub prend cependant en charge une variété de fonctionnalités Subversion, dont une que nous pouvons utiliser à cette fin. Subversion est un système de contrôle de version (une alternative à git). Vous aurez besoin de Subversion installé. Saisissez l'URL GitHub du dossier que vous souhaitez télécharger. Vous devrez cependant modifier cette URL. Vous voulez le lien vers le référentiel, suivi du mot "tronc" et se terminant par le chemin d'accès au dossier imbriqué. En d'autres termes, en utilisant le même exemple de lien de dossier que j'ai mentionné ci-dessus, nous remplacerions "arbre / maître" par "tronc". Enfin, ouvrez un terminal, accédez au répertoire dans lequel vous souhaitez que le contenu soit téléchargé, tapez la commande suivante (en remplaçant l'URL par l'URL que vous avez construite):svn export https://github.com/babel/babel-eslint/trunk/libet appuyez sur entrée.

4. API GitHub

  • C'est la solution dont vous aurez besoin si vous souhaitez accomplir cette tâche par programme. Et c'est en fait ce que DownGit utilise sous le capot. À l'aide de l'API REST de GitHub , écrivez un script qui envoie une requête GET au point de terminaison de contenu. Le critère d' évaluation peut être construit comme suit: https://api.github.com/repos/:owner/:repo/contents/:path. Après avoir remplacé les espaces réservés, un exemple de point de terminaison est:https://api.github.com/repos/babel/babel-eslint/contents/lib. Cela vous donne des données JSON pour tout le contenu qui existe dans ce dossier. Les données ont tout ce dont vous avez besoin, y compris si le contenu est un dossier ou un fichier, une URL de téléchargement s'il s'agit d'un fichier et un point de terminaison API s'il s'agit d'un dossier (afin que vous puissiez obtenir les données pour ce dossier). À l'aide de ces données, le script peut parcourir récursivement tout le contenu du dossier cible, créer des dossiers pour les dossiers imbriqués et télécharger tous les fichiers de chaque dossier. Consultez le code de DownGit pour l'inspiration.
jabacchetta
la source
9

Un autre exemple spécifique:

Comme je veux télécharger le dossier 'iOS Pro Geo' depuis l'url

https://github.com/alokc83/APRESS-Books-Source-Code-/ tree / master /% 20Pro% 20iOS% 20Geo

et je peux le faire via

svn checkout https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

Remarque tronc dans le chemin

Modifié: (selon le commentaire de Tommie C)

Oui, l'utilisation de l' exportation au lieu de l' extraction donnerait une copie propre sans fichiers de dépôt git supplémentaires.

svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

Modifié: si l'arbre / maître n'est pas là dans l'URL, bifurquez-le et il sera là dans l'URL fourchue.

Zeeawan
la source
2
Il vous suffit de modifier l'extraction pour exporter si vous souhaitez simplement télécharger une copie du dossier plutôt que l'extraction.
Tommie C.
Merci pour votre réponse, peut-on plonger dans une branche? disons que je veux télécharger le dossier aaa de la branche
feature1
7

Il y a un paquet pip Python3 appelé githubdlqui peut faire cela *:

export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo

La page du projet est ici

* Avertissement: j'ai écrit ce paquet.

Willem van Ketwich
la source
6

C'est l'un des rares endroits où SVN est meilleur que Git.

Au final, nous avons opté pour trois options:

  1. Utilisez wget pour récupérer les données de GitHub (en utilisant la vue des fichiers bruts).
  2. Demandez aux projets en amont de publier le sous-ensemble de données requis sous forme d'artefacts de génération.
  3. Abandonnez et utilisez la caisse complète. C'est un gros coup sur la première version, mais à moins que vous n'ayez beaucoup de trafic, ce n'est pas trop compliqué dans les versions suivantes.
Manish Shrivastava
la source
4
Eh bien, c'est moins Git vs Subversion et plus que GitHub flat-out ne permet pas git-archive. (J'adorerais savoir pourquoi.)
Rob Howard
6

Si vous êtes à l'aise avec les commandes unix, vous n'avez pas besoin de dépendances spéciales ou d'applications Web pour cela. Vous pouvez télécharger le dépôt sous forme de tarball et décompresser uniquement ce dont vous avez besoin.

Exemple (fichiers woff2 d'un sous-répertoire dans fontawesome):

curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3
  • En savoir plus sur le format du lien: https://developer.github.com/v3/repos/contents/#get-archive-link (y compris comment obtenir un fichier zip ou des branches / références spécifiques)
  • Conservez la partie initiale du chemin ( */) pour correspondre à n'importe quel répertoire. Github crée un répertoire wrapper avec la référence commit dans le nom, il ne peut donc pas être connu.
  • Vous voulez probablement --strip-componentsêtre le même que la quantité de barres obliques ( /) dans le chemin (argument précédent).

Cela téléchargera l'intégralité de l'archive tar. Utilisez la méthode SVN mentionnée dans les autres réponses si cela doit être évité ou si vous voulez être gentil avec les serveurs GitHub.

Albin
la source
5

Vous pouvez faire un simple téléchargement de l'arborescence des répertoires:

git archive --remote [email protected]:foobar/Test.git HEAD:foo | tar xf -

Mais si vous voulez vérifier cela et être capable de faire des commits et de les repousser, non, vous ne pouvez pas le faire.

araqnid
la source
1
Commande non valide: 'git-upload-archive' foobar / Test.git '' Vous semblez utiliser ssh pour cloner une URL git: //. Assurez-vous que votre option de configuration core.gitProxy et la variable d'environnement GIT_PROXY_COMMAND ne sont PAS définies. fatal: l'extrémité distante a raccroché de manière inattendue tar: cela ne ressemble pas à une archive tar tar: fermeture avec état d'échec en raison d'erreurs précédentes
g_inherit
@g_inherit Je peux reproduire ce problème. Bien que cela puisse être la bonne direction, cette réponse n'est pas valide.
Uli Köhler
malgré tant de votes négatifs, c'est le seul conseil qui a fonctionné pour moi.
bhaskarc
5

Juste pour amplifier les réponses ci-dessus, un exemple réel d'un vrai référentiel GitHub vers un répertoire local serait:

svn ls https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces

svn export https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces  /temp/SvnExport/Washburn

Parfois, un exemple concret permet de clarifier les substitutions proposées.

John Washburn
la source
5

Aucune des réponses n'a aidé dans ma situation. Si vous développez pour Windows, vous n'avez probablement pas svn. Dans de nombreuses situations, on ne peut pas non plus compter sur les utilisateurs pour installer Git, ou ne pas vouloir télécharger des référentiels entiers pour d'autres raisons. Certaines des personnes qui ont répondu à cette question, comme Willem van Ketwich et aztack, ont créé des outils pour accomplir cette tâche. Cependant, si l'outil n'est pas écrit pour la langue que vous utilisez ou si vous ne souhaitez pas installer une bibliothèque tierce, cela ne fonctionne pas.

Cependant, il existe un moyen beaucoup plus simple. GitHub dispose d'une API qui vous permet de télécharger un seul fichier ou le contenu d'un répertoire entier à l' aide de requêtes GET . Vous pouvez accéder à un répertoire à l'aide de https://api.github.com/repos/:owner/:repo_name/contents/:pathqui renvoie un objet JSON énumérant tous les fichiers du répertoire. L'énumération comprend un lien vers le contenu brut du fichier, ledownload_url paramètre. Le fichier peut ensuite être téléchargé à l'aide de cette URL.

C'est un processus en deux étapes qui nécessite la possibilité de faire des requêtes GET, mais cela peut être implémenté dans à peu près n'importe quelle langue, sur n'importe quelle plate-forme. Il peut être utilisé pour obtenir des fichiers ou des répertoires.

Calvin
la source
4

J'utilise Linux donc, mettez ça dans ~ / .bashrc, appelé even: D $ HOME / .bashrc

git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}

}

puis rafraîchissez le shell avec

source ~/.bashrc 

puis utilisez-le avec git-downloadfolder blablabla: D

user1088530
la source
3

Je travaille avec des serveurs CentOS 7 sur lesquels je n'ai pas d'accès root, ni git, svn, etc (ni envie!) Donc j'ai fait un script python pour télécharger n'importe quel dossier github: https://github.com/andrrrl/github -folder-downloader

L'utilisation est simple, copiez simplement la partie pertinente d'un projet github, disons que le projet est https://github.com/MaxCDN/php-maxcdn/ , et que vous voulez un dossier où ne sont que certains fichiers source, alors vous devez faire quelque chose comme:

$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(créera le dossier cible s'il n'existe pas)

Il nécessite une bibliothèque lxml , peut être installé avec easy_install lxml
Si vous n'avez pas accès root (comme moi) vous pouvez créer un .pydistutils.pyfichier dans votre répertoire $HOMEavec ces contenus: [install] user=1 Et ça easy_install lxmlmarchera (ref: https://stackoverflow.com/a/ 33464597/591257 ).

aesede
la source
3

Plus que 5 étapes

1) Téléchargez SVN à partir d' ici .
2) Ouvrez CMD et allez dans le répertoire bin SVN comme ci-dessous:

cd %ProgramFiles%\SlikSvn\bin

3) Supposons que je wan télécharger cette URL du répertoire 4) maintenant Remplacer Avec 5) Maintenant tirer cette dernière commande à télécharger le dossier dans le même répertoire.
https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples

tree/develop
or
tree/master
trunk

svn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples

Muhammad Ali
la source
Cela ne semble pas fonctionner pour les
dépôts
Oui, cela ne fonctionnera pas pour les respos privés, GIT est recommandé pour télécharger respo privé.
Muhammad Ali
2

Pour exporter un répertoire depuis GitHub, remplacez "/ tree / master /" dans l'url du répertoire par "/ trunk /".

Par exemple, pour exporter le répertoire à partir de l'URL suivante:

https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet

exécutez la commande suivante:

svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet
Mohsen Abasi
la source
2

Une réponse simple à cela est de d'abord tortue svn à partir du lien suivant.

https://tortoisesvn.net/downloads.html

pendant l'installation, activez l'option CLI, afin qu'elle puisse être utilisée à partir de l'interface de ligne de commande.

copiez le lien du sous-répertoire git hub.

Exemple

https://github.com/tensorflow/models/tree/master/research/deeplab

remplacer l'arbre / maître par le tronc

https://github.com/tensorflow/models/trunk/research/deeplab

et fait

svn checkout https://github.com/tensorflow/models/trunk/research/deeplab

les fichiers seront téléchargés dans le dossier deeplab du répertoire actuel.

Khan
la source
2

vous pouvez utiliser git svn de la manière suivante.

git svn clone https://github.com/lodash/lodash/trunk/test

De cette façon, vous n'avez pas à passer par la difficulté de définir svn, en particulier pour les utilisateurs de Windows.

V3K3R
la source
Merci. Je peux garantir que cela fonctionne pour Windows. Ne fonctionne pas sur gcloud cependant. Il dit git: 'svn' n'est pas une commande
JOSEPH Blessingh
sudo apt install git-svnest requis lors de l'exécution via WSL.
Jammy Dodger
1

Utilisez cette fonction, le premier argument est l'URL du dossier, le second est l'endroit où le dossier sera téléchargé:

function github-dir() {
    svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"  
}
Mine réjouie
la source
1

git clone --filter de Git 2.19

Cette option sautera en fait la récupération des objets inutiles du serveur:

git clone --depth 1 --no-checkout --filter=blob:none \
  "file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/

Le serveur doit être configuré avec:

git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1

Une extension a été apportée au protocole distant Git pour prendre en charge cette fonctionnalité dans la v2.19.0, mais il n'y a pas de prise en charge de serveur pour le moment. Mais il peut déjà être testé localement.

J'ai couvert cela plus en détail à: Comment puis-je cloner un sous-répertoire uniquement d'un référentiel Git?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
1
Intéressant et surévalué. Je suppose que j'ai dû mentionner cette fonctionnalité 2.19 ailleurs.
VonC
@VonC Je pense que je vous ai battu pour cette fois: stackoverflow.com/questions/2466735/… et je ne l'ai regardé qu'après la sortie XD! J'étais bien sûr en train de googler aujourd'hui un peu après la sortie de la version 2.22, toutes les réponses ont bien sûr déjà été mises à jour ;-) Ça ne cesse de m'amuser comme il reste toujours un autre semi-duplicata, toujours, et je finis par le retrouver un an plus tard avec une requête légèrement différente. Je n'ai pas l'intention de vous battre sur git, trop dur, mais gardez un œil sur le nombre de nécromanciens! haha
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Eh bien, continuez votre bon travail: toute la communauté bénéficiera de cette petite compétition parallèle (et j'ai voté pour votre autre réponse à l'époque)
VonC
@VonC plaisantant bien sûr, je vote aussi bien évidemment. J'ai juste besoin de trouver un moyen d'échanger ces points en argent maintenant XD
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1

Pour une raison quelconque, la svnsolution ne fonctionne pas pour moi, et comme je n'ai besoin de svnrien d'autre, cela n'avait pas de sens de passer du temps à essayer de le faire, alors j'ai cherché une solution simple en utilisant les outils que j'avais déjà. Ce script utilise uniquement curlet awkpour télécharger tous les fichiers dans un répertoire GitHub décrit comme "/:user:repo/contents/:path".

Le corps renvoyé d'un appel à la "GET /repos/:user:repo/contents/:path"commande API REST GitHub renvoie un objet qui inclut un "download_url"lien pour chaque fichier d'un répertoire.

Ce script de ligne de commande appelle cette API REST en utilisant curlet envoie le résultat via AWK, qui filtre toutes les lignes sauf "download_url", efface les guillemets et les virgules des liens, puis télécharge les liens à l'aide d'un autre appel à curl.

curl -s https://api.github.com/repos/:user/:repo/contents/:path | awk \
     '/download_url/ { gsub("\"|,", "", $2); system("curl -O "$2"); }'
Pomme de pin
la source
1

git sparse-checkout

Git 2.25.0 inclut une nouvelle git sparse-checkoutcommande expérimentale qui rend la fonctionnalité existante plus facile à utiliser, ainsi que des avantages de performances importants pour les grands référentiels. ( Le blog GitHub )

Exemple avec la version actuelle :

git clone --filter=blob:none --sparse https://github.com/git/git.git
cd git
git sparse-checkout init --cone
git sparse-checkout add t

Notamment

  • --sparseextrait uniquement les fichiers de gitrépertoire de niveau supérieur du référentiel dans la copie de travail
  • git sparse-checkout add tajoute / extrait progressivement le tsous-dossier degit

Autres éléments

  • git sparse-checkout init fait quelques préparatifs pour activer les extractions partielles
  • --filter=blob:noneoptimise la récupération des données en téléchargeant uniquement les objets git nécessaires (jetez un œil à la fonction de clonage partiel pour plus d'informations)
  • --cone accélère également les performances en appliquant des modèles d'inclusion de fichiers plus restreints

Statut GitHub

GitHub évalue toujours cette fonctionnalité en interne alors qu'elle est activée sur quelques référentiels sélectionnés [...]. Au fur et à mesure que la fonctionnalité se stabilise et mûrit, nous vous tiendrons au courant de ses progrès. ( documents )

ford04
la source
A voté. J'ai présenté cette commande dans stackoverflow.com/a/59515426/6309 , avec le modèle de clone défini.
VonC