web-dev-qa-db-fra.com

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

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

Dites l'exemple GitHub repo habite ici:

[email protected]:foobar/Test.git

Sa structure de répertoire:

Test/
    foo/ 
       a.py
       b.py
    bar/
       c.py
       d.py

Je souhaite télécharger uniquement le dossier foo et ne pas cloner le projet Test dans son ensemble.

792
g_inherit

Mise à jour septembre 2016: il existe quelques outils créés par la communauté qui 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 référentiel de git en Subversion sur le backend, puis servira le répertoire demandé.

Voici comment utiliser cette fonctionnalité pour télécharger un dossier spécifique. Je vais utiliser la bibliothèque javascript populaire lodash à titre d'exemple.

  1. Récupère l'URL du dépôt. Commencez par copier l’URL du dépôt Github dans votre presse-papiers .  github repo URL example

  2. Modifiez l'URL pour Subversion. Je souhaite télécharger le dossier à /docs à partir de la branche master. Je vais donc ajouter trunk/docs. L'URL complète est maintenant https://github.com/lodash/lodash/trunk/docs. Voir la note ci-dessous pour une explication plus détaillée des raisons pour lesquelles nous devons utiliser ce format d'URL.

  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/docs

Il est possible que vous ne voyiez aucune activité immédiatement car Github prend jusqu'à 30 secondes pour convertir des référentiels plus importants. Soyez donc patient.

Explication du format complet de l'URL: _

  • Si vous êtes intéressé par la branche master, utilisez plutôt trunk. Donc, le chemin complet est trunk/foldername
  • Si vous êtes intéressé par la branche foo, utilisez plutôt branches/foo. Le chemin complet ressemble à branches/foo/foldername
  • Protip: Si vous le souhaitez, vous pouvez utiliser svn ls pour voir les tags et les branches disponibles avant le téléchargement.

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

749
nick

Deux options pour cette fonctionnalité:

Option 1: Extensions du navigateur

Extension Chrome , Firefox Addon

Usage:

  1. Dans n'importe quelle page de dépôt GitHub. 
  2. Double-cliquez simplement sur les é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 la progression et attendez le téléchargement du déclencheur de navigateur.
  5. Obtenez le fichier Zip.

Obtenir un jeton:

  1. Cliquez sur l'icône Extension GitZip de votre navigateur.
  2. Cliquez sur le lien "Normal" ou "Privé" en plus de "Obtenir un jeton".
  3. Autoriser l'autorisation GitZip sur la page d'authentification Github.
  4. Retour à la page de repo du début.
  5. Continuer à utiliser.

Option 2: Github gh-page

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

Étape 1: Entrez l’URL github dans le champ situé en haut à droite.
Étape 2: Appuyez sur Entrée ou cliquez sur Télécharger pour télécharger Zip directement ou cliquez sur Rechercher pour afficher la liste des sous-dossiers et des fichiers.
Étape 3: Cliquez sur le bouton "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 à API Github # Contenu )

Et il peut également prendre en charge les pensions privées/publiques et mettre à niveau la limite de débit si vous avez un compte GitHub et utilisez le lien "get token" sur ce site. 

423
Kino

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

Vous pouvez maintenant TÉLÉCHARGER DIRECTEMENT ou créer DOWNLOAD LINK pour tout répertoire public ou fichier GitHub (fichier particulièrement volumineux) depuis DownGit ! Voici une simple démonstration-


 DownGit


Vous pouvez également configurer la propriété du fichier téléchargé - utilisation détaillée .

371
Minhas Kamal

Si vous avez svn, vous pouvez utiliser svn export pour faire ceci:

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

Notez le format de l'URL:

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

Avant d'exécuter 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
143
janos

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

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

git-archive cré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 les répertoires du référentiel git à archiver.
  2. Il n'archive pas le dossier .git/ ni les fichiers non suivis du 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.

Exemple de création d'une archive du répertoire docs/usage à partir d'un dépôt 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.tgz

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

Note sur les dépôts GitHub:

GitHub n'autorise pas l'accès git-archive . ☹️

60
RobW

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 cloner ou télécharger l'intégralité du référentiel.

34
VahidN

Rien de mal avec les autres réponses mais je pensais juste que je partagerais des instructions pas à pas pour ceux qui errent dans ce processus pour la première fois.

Comment télécharger un seul dossier depuis un référentiel github (Mac OS X):

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

  1. Sur un Mac, vous avez probablement déjà un SVN (pour tester, ouvrez simplement un terminal et tapez Tapez "svn" ou "qui svn" ~ sans les guillemets)
  2. Sur Github: localisez le chemin Github de votre dossier git (pas du référentiel) en cliquant sur le nom du dossier spécifique dans un référentiel.
  3. Copiez le chemin depuis la barre d'adresse du navigateur
  4. Open Terminal et tapez: svn export
  5. Ensuite, collez l'adresse (par exemple): https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. Remplacez les mots: tree/master 
  7. avec le mot: trunk
  8. Tapez le dossier de destination des fichiers (dans cet exemple, Istore 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, pas le mot (espace) ~/Téléchargements/HeadsUpUI
  10. La commande finale du terminal affiche la commande complète pour télécharger le fichier dossier (comparer l'adresse à l'étape 5) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~/Téléchargements/HeadsUpUI

BTW - Si vous êtes sur Windows ou une autre plate-forme, vous pouvez trouver un téléchargement binaire de Subversion (svn) à l’adresse http://Subversion.Apache.org

~ Si vous voulez extraire le dossier plutôt que simplement le télécharger, essayez d'utiliser svn help (tldr: replace export avec checkout).

Mettre à jour

Concernant le commentaire sur la reprise d'un téléchargement/d'une commande interrompu. J'essayerais d'exécuter svn cleanup suivi de svn update. Veuillez rechercher SO pour des options supplémentaires.

28
Tommie C.

Vous ne pouvez pas; Contrairement à Subversion, où chaque sous-répertoire peut être extrait individuellement, Git fonctionne sur 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 client Git frontal (par exemple, l’interface Web de GitHub ou gitweb) puisse choisir de vous fournir une interface permettant d’extraire un dossier donné, mais à ma connaissance aucun d’entre eux ne le fait 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 le faire (selon le commentaire). Voir https://github.com/blog/1438-improved-svn-here-tststst-old-svn-going-away pour obtenir les dernières instructions sur la procédure à suivre.

15
michel-slm

Si vous voulez vraiment juste "télécharger" le dossier et non "cloner" ça (pour le développement), le moyen le plus simple de simplement obtenir un copy de la version la plus récente du référentiel (et donc un dossier/fichier en son sein), sans avoir besoin de cloner tout le référentiel ni 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 souhaité/branchez/branchez/commit sur GitHub (par exemple, http(s)://github.com/<user>/<repo>/commit/<Sha1> pour obtenir une copie des fichiers tels qu’ils étaient après un commit spécifique) et sélectionnez le bouton Downloads dans le coin supérieur droit.

Ce format d’archive ne contient aucune magie de git-repo, mais seulement les fichiers suivis eux-mêmes (et peut-être quelques fichiers .gitignore s’ils ont été suivis, mais vous pouvez les ignorer: p) - c’est-à-dire que si le code change et que vous voulez restez au top, vous devrez le télécharger à nouveau manuellement, ce qui signifie également que vous ne pourrez plus 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"/voir contre "cloner"/développer), mais cela peut néanmoins être utile ...

13
johnny

Quiconque travaille sur un dossier spécifique dont il a besoin pour cloner ce dossier lui-même doit également suivre les étapes ci-dessous.

Étape 1: Créez un répertoire.

Étape 2: initialisez un référentiel Git. (git init)

Étape 3: Activer les extractions fragmentées. (git config core.sparsecheckout true)

Étape 4: Indiquez à Git les répertoires de votre choix (echo 2015/brand/May (voir le dossier sur lequel vous souhaitez travailler) >> .git/info/sparse-checkout

Étape 5: Ajouter la télécommande (git remote add -f Origin https://jafartke.com/mkt-imdev/DVM.git)

Dernière étape 6: récupérer les fichiers (git pull Origin master)

12
Mohammed Jafar

1.Cliquez sur ce lien http://kinolien.github.io/gitzip/
2.Lien de liaison du dossier Github à télécharger.
3.Cliquez sur le bouton de recherche pour afficher tous les fichiers à télécharger.
Remarque: -En utilisant la recherche, il n’est pas nécessaire de saisir une clé symbolique;) .. restez simple (y)

11
M Younus

Un autre exemple spécifique:

Comme je veux télécharger le dossier 'iOS Pro Geo' à partir de 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

Notez trunk dans le chemin

Édité: (selon le commentaire de Tommie C)

Oui, utiliser export au lieu de checkout donnerait une copie vierge sans fichiers de référentiel Git supplémentaires.

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

Edited: Si tree/master n’est pas présent dans l’URL, indiquez Fork et le fichier apparaîtra dans l’adresse Forked. 

8
zeeawan

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

En fin de compte, nous avons choisi trois options:

  1. Utilisez wget pour récupérer les données de GitHub (en utilisant la vue de fichier brut).
  2. Demandez aux projets en amont de publier le sous-ensemble de données requis sous forme d'artefacts de construction.
  3. Abandonnez et utilisez la caisse complète. C'est un gros succès sur la première version, mais à moins de générer beaucoup de trafic, les versions suivantes ne sont pas très compliquées.
6
Manish Shrivastava

Juste pour amplifier les réponses ci-dessus, un exemple réel d’un référentiel GitHub réel 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 aide à clarifier les substitutions proposées.

4
John Washburn

Vous pouvez faire un simple téléchargement de l’arborescence:

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

Mais si vous voulez vérifier et pouvoir faire des commits et les repousser, non, vous ne pouvez pas le faire.

4
araqnid

J'utilise Linux alors, mettez ceci dans ~/.bashrc, appelé même: D $ HOME/.bashrc

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

}

puis actualisez le shell avec 

source ~/.bashrc 

puis utilisez-le avec git-downloadfolder blablabla: D

4
user1088530

Il existe un package pip Python3 appelé githubdl qui 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.

4
Willem van Ketwich

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

Exemple (fichiers woff2 d'un sous-répertoire de 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 de validation dans le nom, de sorte qu'il ne peut pas être connu.
  • Vous voulez probablement que --strip-components soit identique à la quantité de barres obliques (/) dans le chemin (argument précédent).

Cela téléchargera l'archive entière. 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.

4
Albin

Je travaille avec des serveurs CentOS 7 sur lesquels je n’ai ni accès root, ni git, svn, etc. (je ne le veux pas non plus). J’ai donc créé un script python pour télécharger n’importe quel dossier github: https://github.com/ andrrrl/github-folder-downloader }

L’utilisation est simple, il suffit de copier la partie pertinente d’un projet github, disons que le projet est https://github.com/MaxCDN/php-maxcdn/ et vous voulez un dossier contenant certains fichiers source. seulement, alors vous devez faire quelque chose comme: 

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

Il nécessite la bibliothèque lxml , peut être installé avec easy_install lxml
Si vous n’avez pas accès à la racine (comme moi), vous pouvez créer un fichier .pydistutils.py dans votre répertoire $HOME avec le contenu suivant: [install] user=1 Et easy_install lxml fonctionnera simplement (ref: https://stackoverflow.com/a/33464597/591257 ).

3
aesede

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, ni pour télécharger des référentiels entiers pour d'autres raisons. Certaines des personnes qui ont répondu à cette question, telles que Willem van Ketwich et aztack, ont créé des outils pour accomplir cette tâche. Toutefois, si l'outil n'est pas écrit pour la langue que vous utilisez ou si vous ne souhaitez pas installer de bibliothèque tierce, cela ne fonctionne pas.

Cependant, il existe un moyen beaucoup plus simple. GitHub a 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/:path qui renvoie un objet JSON énumérant tous les fichiers du répertoire. L'énumération contient un lien vers le contenu brut du fichier, le paramètre download_url. Le fichier peut ensuite être téléchargé en utilisant 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 quel langage, sur n'importe quelle plate-forme. Il peut être utilisé pour obtenir des fichiers ou des répertoires.

2
Calvin

Notre équipe a écrit un script bash pour cela car nous ne voulions pas installer SVN sur notre serveur sans système d'exploitation.

https://github.com/ojbc/docker/blob/master/Java8-karaf3/files/git-download.sh

Il utilise l'API github et peut être exécuté à partir de la ligne de commande comme ceci:

git-download.sh https://api.github.com/repos/ojbc/main/contents/shared/ojb-certs
2
Yogesh Chawla

git clone --filter de Git 2.19

En fait, cette option évitera d’obtenir des objets inutiles sur le 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 du protocole distant Git a été réalisée pour prendre en charge cette fonctionnalité dans la version 2.1.0, mais aucun serveur n'est actuellement pris en charge. Mais il peut déjà être testé localement.

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

J'ai écrit un outil avec Node.js juste pour ça. Check it out Téléchargez Repo Dir

installer avec npm i -g dl-repo-dir et la commande repo seront disponibles globalement.

télécharger et renommer un répertoire dans un référentiel

repo download aztack/download-repo-dir lib src/lib/new-name

télécharger un référentiel

repo download aztack/download-repo-dir '' src/lib/download-repo-dir

télécharger depuis un dépôt privé gitlab avec une balise donnée

export GITLAB_API_PRIVATE_TOKEN=YOUR_TOKEN_HERE

repo download gitlab:mygitlab.com:topgroup/subgroup/repo#v1.0.0 dir src/lib/new-name

et il y aura un fichier repo.json pour enregistrer toutes les informations.

Dans un nouveau projet, vous pouvez l'initialiser avec la commande exist repo.json à l'aide de la commande repo init.

1
aztack

Si vous devez le faire par programme et que vous ne voulez pas vous fier à SVN, vous pouvez utiliser l'API GitHub pour télécharger tout le contenu de manière récursive.

Pour l'inspiration, voici mon Ruby Gist: https://Gist.github.com/cvengros/b2a7e82f66519d423b6f

1
pcv

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

lancez la commande suivante:

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

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"  
}
0
HappyFace

Si vous souhaitez utiliser Python et SVN pour télécharger un répertoire GitHub spécifique, voici le code que vous utiliseriez:

import validators
from svn.remote import RemoteClient

def download_folder(url):
    if 'tree/master' in url:
        url = url.replace('tree/master', 'trunk')

    r = RemoteClient(url)
    r.export('output')


if __== '__main__':
    url = input('Enter folder URL: ')
    if not validators.url(url):
        print('Invalid url')
    else:
        download_folder(url)

Vous pouvez consulter plus de détails sur ce code et d'autres astuces de recherche et de téléchargement GitHub dans ce tutoriel: https://python.gotrained.com/search-github-api/

0
GoTrained

Une réponse simple à cette question est de commencer par la tortue svn à partir du lien suivant.

https://tortoisesvn.net/downloads.html

lors de 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/le 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 en cours.

0
Khan