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.
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.
Récupère l'URL du dépôt. Commencez par copier l’URL du dépôt Github dans votre presse-papiers .
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.
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ôttrunk
. Donc, le chemin complet esttrunk/foldername
- Si vous êtes intéressé par la branche
foo
, utilisez plutôtbranches/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.
Usage:
Obtenir un jeton:
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.
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-
Vous pouvez également configurer la propriété du fichier téléchargé - utilisation détaillée .
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:
https://github.com/
/trunk
ajouté à la finAvant 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
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:
.git/
ni les fichiers non suivis du référentiel sur lequel il est exécuté.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 .
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.
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.
~ Pour ouvrir Terminal, cliquez sur Spotlight et tapez Terminal, puis appuyez sur Entrée.
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.
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.
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 ...
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
)
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)
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.
C'est l'un des rares endroits où SVN est meilleur que Git.
En fin de compte, nous avons choisi trois options:
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.
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.
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
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.
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
*/
) 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.--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.
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 ).
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.
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
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.
repo download aztack/download-repo-dir lib src/lib/new-name
repo download aztack/download-repo-dir '' src/lib/download-repo-dir
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
.
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
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
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"
}
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/
Une réponse simple à cette question est de commencer par la tortue svn à partir du lien suivant.
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
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.