Scarica una singola cartella o directory da un repository GitHub


1106

Come posso scaricare solo una cartella o directory specifica da un repository Git remoto ospitato su GitHub?

Di 'l'esempio del repository GitHub che vive qui:

git@github.com:foobar/Test.git

La sua struttura di directory:

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

Voglio scaricare solo la cartella foo e non clonare l'intero progetto Test.


4
Ho scritto uno script di shell per questo usando svn checkout - github.com/Decad/github-downloader
Declan Cook

391
Qualcuno può spiegarmi perché non esiste una soluzione di interfaccia web "ufficiale" a questo? Sembra una funzionalità banale da implementare, ma super utile.
Alexander - Ripristina Monica il

3
Ho sviluppato un'estensione di Chrome usando il gitzip di KinoLien. github.com/charany1/GHSDD
charany1

3
vedi la risposta di @janos svn l'alternativa è la migliore, nessuna autenticazione, nessuna registrazione, nessun limite, nessun plug-in
stackdave

5
Ho fatto una soluzione leggera per questo ( download-directory.github.io ) ed è integrata in Raffinato GitHub
fregante

Risposte:


1036

Aggiornamento settembre 2016: ci sono alcuni strumenti creati dalla community che possono farlo per te:


Git non supporta questo, ma Github lo fa tramite SVN. Se esegui il checkout del tuo codice con sovversione, Github essenzialmente convertirà il repository da git a sovversione sul back-end, quindi servirà la directory richiesta.

Ecco come è possibile utilizzare questa funzione per scaricare una cartella specifica. Userò la popolare libreria javascript lodashcome esempio.

  1. Passare alla cartella che si desidera scaricare . Scarichiamolo /testdalla masterfiliale. esempio di URL repo github

  2. Modifica l'URL per la sovversione . Sostituisci tree/mastercon trunk.

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

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

  3. Scarica la cartella . Vai alla riga di comando e prendi la cartella con SVN.

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

Potresti non vedere immediatamente alcuna attività perché Github impiega fino a 30 secondi per convertire i repository più grandi, quindi sii paziente.

Spiegazione completa del formato URL:

  • Se sei interessato al masterramo, usa trunkinvece. Quindi il percorso completo ètrunk/foldername
  • Se sei interessato al fooramo, usa branches/fooinvece. Sembra il percorso completobranches/foo/foldername
  • Protip: puoi usare svn lsper vedere i tag e le filiali disponibili prima di scaricare se lo desideri

È tutto! Github supporta anche più funzioni di sovversione , incluso il supporto per il commit e la modifica delle modifiche.


162
Fantastico, basta sostituire tree/mastercon trunke puoi ottenere la cartella specifica.
Sérgio Michels,

6
Grazie @ user1146881 e @ SérgioMichels, devi sostituirlo tree/mastercon trunk. Questa informazione dovrebbe essere aggiunta in risposta.
Baptx

8
L'ho modificato per usarlo svn export, poiché non volevo una copia funzionante di Subversion. Quindi ho aggiunto la cartella risultante in Git. (In qualche modo ho perso un grosso pezzo del mio albero di directory, quindi ho esportato dal repository che ho biforcato.)
Grault

5
@ num3ric- scusa per la risposta tardiva, ma dovresti essere in grado di sostituire "trunk" con "filiali / tuobranch"
nick

2
@ElijahLynn Grazie per la modifica, avrei dovuto includere quelle informazioni! 2 cose però: ho accettato la tua modifica ma ne ho ripristinato alcune mie (intendevo farlo comunque, mi sembrava troppo disordinato). Inoltre ho cambiato il tuo branchpercorso a branches, che penso sia corretto; in caso contrario, andare avanti e cambiarlo indietro.
nick,

568

Due opzioni per questa funzione:

Opzione 1: estensione del browser GitZip

Estensione di Chrome , componente aggiuntivo di Firefox

Uso:

  1. In qualsiasi pagina di repository GitHub.
  2. Basta fare doppio clic sulla parte vuota degli elementi necessari.
  3. Fai clic sul pulsante di download in basso a destra.
  4. Vedi la dashboard di avanzamento e attendi il download del trigger del browser.
  5. Ottieni il file ZIP.

Ottieni token:

  1. Fai clic sull'icona Estensione GitZip sul tuo browser.
  2. Fai clic sul link "Normale" o "Privato" oltre a "Ottieni token".
  3. Autorizza l'autorizzazione GitZip sulla pagina di autenticazione di Github.
  4. Torna alla pagina repo dell'inizio.
  5. Continua a usare.

Opzione 2: Github gh-page

http://kinolien.github.io/gitzip utilizzando l'API GitHub e le librerie JSZip, FileSaver.js.

Passaggio 1: inserisci l'URL github nel campo in alto a destra.
Passaggio 2: premere Invio o fare clic su Scarica per scaricare direttamente lo zip o fare clic su Cerca per visualizzare l'elenco di sottocartelle e file.
Passaggio 3: fare clic sul pulsante "Scarica file zip" o "Ottieni file" per ottenere i file.

Nella maggior parte dei casi, funziona benissimo, tranne per il fatto che la cartella contiene più di 1.000 file, a causa della limitazione dell'API Github Trees. (si riferisce a Github API # Contents )

E può anche supportare repository privati ​​/ pubblici e aggiornare il limite di velocità, se si dispone di un account GitHub e si utilizza il link "get token" in questo sito.


5
Questo è fantastico, ma sembra così fantastico che la domanda ti sta spingendo oltre il tuo ratelimit e quindi non funziona più ;-) Sarebbe bello poter accedere con GitHub oAuth - che consentirebbe il supporto repo privato e aumenterebbe il limite di velocità poiché sarebbero richieste autenticate
hobailey,

3
@hobailey Ora, può ottenere il token di accesso per aumentare il limite di velocità e accedere ai repository privati.
Kino,

1
@MYounas Vedi i capitoli OAuth, Trees, Blobs nel documento API di Github. e utilizzare anche le librerie js JSZip, FileSaver.js per l'implementazione di gitzip.
Kino,

1
Qualcuno potrebbe essere interessato a un'estensione Chrome che fa questo?
goldylucks il

4
Questo deve davvero essere aggiunto al sito web di github, è estremamente utile.
lancia il

508

Vai su DownGit > Inserisci il tuo URL> Scarica!

Ora, puoi SCARICARE DIRETTAMENTE o creare DOWNLOAD LINK per qualsiasi directory o file pubblico GitHub (file particolarmente grande ) da DownGit ! Ecco una semplice dimostrazione-


DownGit


È inoltre possibile configurare l' utilizzo dettagliato delle proprietà del file scaricato .


2
Fratello, intendo come creare un progetto come DownGit che hai creato.
Muhammad Younus,

12
Il metodo di base è- 1. prendi il link della directory (usato angular-route ), 2. vai all'API GitHub , 3. cerca nella directory e scarica tutti i file, 4. crea un file zip con esso (ho usato jszip ) e salvalo come file (usato filesaver per questo). Per una chiara comprensione, suggerirei di dare un'occhiata al mio progetto .
Minhas Kamal,

1
Grazie Bro per istruzioni dettagliate, ti sono molto grato se suggerisci tutorial o link.
Muhammad Younus,

5
Questo è bello ma non funziona con strumenti automatici (come wget)
Ring

1
Questo si blocca downloaded 25 of 25 filesquando provo a scaricare da questo URL: github.com/dssg/hitchhikers-guide/tree/master/curriculum/…
Wassadamo,

164

Se hai svn, puoi usare svn exportper fare questo:

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

Si noti il ​​formato URL:

  • L'URL di base è https://github.com/
  • /trunk aggiunto alla fine

Prima di eseguire svn export, è bene verificare innanzitutto il contenuto della directory con:

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

Funziona ancora? Ho provato questo con TortiseSVN e ho ricevuto un errore di autorizzazione, chiedendomi di fornire le credenziali.
Giovanni,

2
@john Sono sicuro che è troppo tardi per essere di grande aiuto, ma hai abilitato l'autenticazione a 2 fattori sul tuo account GitHub? In tal caso, penso di aver letto da qualche parte che dovrai usare una chiave pre-generata per la password (che dovrai trovare nelle impostazioni di GitHub).
nick,

1
Per quanto riguarda la formattazione dell'URL, è possibile mantenere l' .gitestensione. È possibile utilizzare il collegamento completo al progetto e iniziare utilizzando svn lsseguito dal percorso completo del progetto. Esempio: svn ls https://github.com/RobTillaart/Arduino.git. Per esportare solo una cartella, basta aggiungere il /trunkseguito dal percorso desiderato, come svn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib. È più facile mantenere intatto il percorso del progetto.
jgrocha,

@jgrocha Non sono sicuro che abbia funzionato in questo modo nel 2013, ma ora lo fa, quindi grazie,
ho

1
Un esempio: per scaricare il contenuto https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi, eseguire svn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi. Una directory chiamata wsgiverrà creata nella directory di lavoro corrente. Solo file di origine, nient'altro. No .git, nessun file relativo alla sovversione.
Rockallite,

74

Per un git Repo generico:

Se si desidera scaricare file, non clonare il repository con cronologia, è possibile farlo con git-archive.

git-archivecrea un archivio compresso zip o tar di un repository git. Alcune cose che lo rendono speciale:

  1. Puoi scegliere quali file o directory nel repository git archiviare.
  2. Non archivia la .git/cartella o qualsiasi file non tracciato nel repository su cui viene eseguita.
  3. È possibile archiviare un ramo, tag o commit specifici. I progetti gestiti con git spesso lo usano per generare archivi di versioni del progetto (beta, release, 2.0, ecc.) Che gli utenti possono scaricare.

Un esempio di creazione di un archivio della docs/usagedirectory da un repository remoto a cui sei connesso con ssh:

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

Maggiori informazioni in questo post del blog e la documentazione git .

Nota sui repository GitHub:

GitHub non consente l' git-archiveaccesso . ☹️


2
git archive --format taril formato non è tar.gz, ma tar.
出 羽 和 之

Questa dovrebbe essere la risposta migliore
Felipe Costa

2
Penso che questa sia la risposta migliore, ma tieni presente che il comando git archive non funziona con il protocollo https.
Bitfox

@yukihane ha modificato l'estensione da tar.gz a tar, speriamo che OP sia a bordo con questo
mihai

36

Ho creato un progetto open source, chiamato GitHubFolderDownloader . Ti consente di scaricare una singola cartella di un repository senza clonare o scaricare l'intero repository.


Funziona alla grande se hai solo bisogno di scaricare cartelle da GitHub. Per scaricare la cartella desiderata è sufficiente un token Github . Altri voti potrebbero dare una certa importanza a questa risposta.
Alex Essilfie,

34

Nulla di sbagliato in altre risposte, ma ho pensato di condividere le istruzioni dettagliate per coloro che vagavano per questo processo per la prima volta.

Come scaricare una singola cartella da un repository github (Mac OS X):

~ Per aprire Terminale, fai clic su Spotlight e digita Terminale, quindi premi Invio

  1. Su un Mac probabilmente hai già SVN (per provare basta aprire il terminale e digitare "svn" o "che svn" ~ senza virgolette)
  2. Su Github: individuare il percorso Github nella cartella git (non nel repository) facendo clic sul nome della cartella specifica all'interno di un repository
  3. Copia il percorso dalla barra degli indirizzi del browser
  4. Apri Terminale e digita: svn export
  5. Prossimo incolla nell'indirizzo (es.): Https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. Sostituisci le parole: albero / maestro
  7. con la parola: tronco
  8. Digita la cartella di destinazione per i file (in questo esempio, memorizzo la cartella di destinazione all'interno della cartella Download per l'utente corrente)
  9. Qui lo spazio è solo la barra spaziatrice non la parola (spazio) ~ / Download / HeadsUpUI
  10. Il comando finale del terminale mostra il comando completo per scaricare la cartella (confrontare l'indirizzo con il passaggio 5) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~ / Downloads / HeadsUpUI

A proposito: se sei su Windows o un'altra piattaforma puoi trovare un download binario di subversion (svn) su http://subversion.apache.org

~ Se vuoi fare il checkout della cartella piuttosto che scaricarla, prova a usare la guida svn (tldr: sostituisci export con checkout )

Aggiornare

Per quanto riguarda il commento sulla ripresa di un download / checkout interrotto. Proverei a correre svn cleanupseguito da svn update. Cerca SO per ulteriori opzioni.


1
Devo scaricare molti file da una cartella specifica e ho ricevuto questo errore durante il download: svn: E175002: RAPPORTO di '/ bgmartins / scripts-parlamento /! Svn / vcc / default': 200 OK ( github.com ) Come posso riprendere il download?
Miguel,

Ha funzionato per me. È stupefacente.
Heath Raftery,

24

Chiunque lavori su una cartella specifica ha bisogno di clonare quella stessa cartella, per farlo segui i passaggi seguenti usando il checkout sparse.

  1. Crea una directory.

  2. Inizializza un repository Git. ( git init)

  3. Abilita checkout sparsi. ( git config core.sparsecheckout true)

  4. Di 'a Git quali directory vuoi (echo 2015 / brand / May (fai riferimento alla cartella su cui vuoi lavorare) >> .git/info/sparse-checkout)

  5. Aggiungi il telecomando ( git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)

  6. Recupera i file ( git pull origin master)


Peccato che questo commento non abbia ottenuto abbastanza voti. Sembra che la soluzione fornita si applichi a tutti i repository git e non solo a quello github.
Kalyan,

9
Questo in realtà non fa ciò che era desiderato, però. Clona ancora l'intero repository, semplicemente non controlla alcune cartelle.
Chris,


Ottengo questo errore: il checkout sparso non lascia alcuna voce nella directory di lavoro.
orangecaterpillar

20

Non puoi; a differenza di Subversion, in cui ogni sottodirectory può essere estratta singolarmente, Git opera su un intero repository.

Per i progetti in cui è necessario un accesso più preciso, è possibile utilizzare i sottomoduli: ogni sottomodulo è un progetto Git separato e quindi può essere clonato individualmente.

È concepibile che un front-end Git (ad es. L'interfaccia web di GitHub o gitweb) possa scegliere di fornire un'interfaccia per estrarre una determinata cartella, ma per quanto ne so nessuno di loro lo fa (anche se ti consente di scaricare singoli file , quindi se la cartella non contiene troppi file, questa è un'opzione)

Modifica - GitHub offre effettivamente l'accesso tramite SVN, che ti permetterebbe di fare proprio questo (come da commento). Consulta https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away per le ultime istruzioni su come eseguire questa operazione


c'è qualcosa tramite l'API di Github?
g_inherit,

14

Se vuoi semplicemente "scaricare" la cartella e non "clonarla" (per lo sviluppo), il modo più semplice per ottenere semplicemente una copia della versione più recente del repository (e quindi una cartella / file al suo interno), senza la necessità di clonare l'intero repository o di installare git in primo luogo, è scaricare un archivio zip (per repository, fork, branch, commit, ecc.) andando nel repository / fork / branch / commit desiderato su GitHub (ad es. http(s)://github.com/<user>/<repo>/commit/<Sha1>per una copia dei file come erano dopo un commit specifico) e selezionando il Downloadspulsante in alto a destra.

Questo formato di archivio non contiene alcuna magia git-repo, solo i file tracciati stessi (e forse alcuni file .gitignore se sono stati tracciati, ma puoi ignorarli: p) - ciò significa che se il codice cambia e vuoi resta in cima, dovrai scaricarlo di nuovo manualmente e significa anche che non sarai in grado di usarlo come repository git ...

Non sono sicuro se questo è quello che stai cercando in questo caso (di nuovo, "scarica" ​​/ visualizza vs "clone" / sviluppa), ma può essere comunque utile ...


9
Se non vedi un link per il download, assicurati di essere nella pagina principale del repository (non in una directory figlio). Sembra che puoi scaricare solo una zip dell'intero repository. Inoltre, questa pagina di aiuto di github potrebbe essere utile.
JD Smith,

2
Facile accesso point-and-click. Facile ottenere una versione precedente. Facile estrarre la cartella desiderata dalla zip scaricata. Grazie.
Andy Thomas,

1
L'URL generico da cui scaricare il download in tar.gz:https://github.com/${owner}/${repo}/archive/${hash}.tar.gz
Krisztian,

11

Riepilogo 2019

Esistono diversi modi per gestirlo, a seconda che tu voglia o meno farlo manualmente o programmaticamente.

Di seguito sono elencate quattro opzioni. E per coloro che preferiscono una spiegazione più pratica, ho messo insieme un video di YouTube: Scarica singoli file e cartelle da GitHub .

Inoltre, ho pubblicato una risposta simile su StackOverflow per coloro che hanno bisogno di scaricare singoli file da GitHub (al contrario delle cartelle).


1. Interfaccia utente di GitHub

  • C'è un pulsante di download sulla homepage del repository. Ovviamente, questo scarica l'intero repository, dopodiché dovrai decomprimere il download e quindi trascinare manualmente la cartella specifica di cui hai bisogno.

2. Strumenti di terze parti

  • Esistono diverse estensioni del browser e app Web in grado di gestirlo, di cui DownGit è una di queste. Basta incollare l'URL GitHub nella cartella (ad es. https://github.com/babel/babel-eslint/tree/master/lib) E premere il pulsante "Download".

3. Sovversione

  • GitHub non supporta git-archive (la funzione git che ci consentirebbe di scaricare cartelle specifiche). GitHub, tuttavia, supporta una varietà di funzionalità di Subversion, una delle quali possiamo usare a questo scopo. Subversion è un sistema di controllo della versione (un'alternativa a git). Avrai bisogno di Subversion installato. Prendi l'URL GitHub per la cartella che desideri scaricare. Tuttavia, dovrai modificare questo URL. Si desidera il collegamento al repository, seguito dalla parola "trunk" e termina con il percorso della cartella nidificata. In altre parole, usando lo stesso esempio di collegamento di cartella che ho menzionato sopra, sostituiremmo "albero / master" con "trunk". Infine, apri un terminale, vai alla directory in cui desideri scaricare il contenuto, digita il seguente comando (sostituendo l'URL con l'URL che hai costruito):svn export https://github.com/babel/babel-eslint/trunk/libe premere Invio.

4. API GitHub

  • Questa è la soluzione di cui hai bisogno se vuoi svolgere questo compito a livello di codice. E questo è ciò che DownGit sta usando sotto il cofano. Utilizzando l'API REST di GitHub , scrivere uno script che esegua una richiesta GET all'endpoint del contenuto. L'endpoint può essere costruito come segue: https://api.github.com/repos/:owner/:repo/contents/:path. Dopo aver sostituito i segnaposto, un endpoint di esempio è:https://api.github.com/repos/babel/babel-eslint/contents/lib. Questo ti dà dati JSON per tutto il contenuto esistente in quella cartella. I dati hanno tutto ciò di cui hai bisogno, incluso se il contenuto è una cartella o un file, un URL di download se è un file e un endpoint API se è una cartella (in modo da poter ottenere i dati per quella cartella). Utilizzando questi dati, lo script può scorrere in modo ricorsivo tutto il contenuto della cartella di destinazione, creare cartelle per cartelle nidificate e scaricare tutti i file per ogni cartella. Controlla il codice di DownGit per ispirazione.

9

Un altro esempio specifico:

Come se volessi scaricare la cartella "iOS Pro Geo" dall'URL

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

e posso farlo tramite

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

Nota tronco nel percorso

Modificato: (come da commento di Tommie C)

Sì, l'uso di export anziché di checkout darebbe una copia pulita senza file di repository git extra.

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

Modificato: se l'albero / il master non è presente nell'URL, quindi Forklo e sarà presente nell'URL Forked.


2
Devi solo cambiare il checkout per esportare se vuoi solo scaricare una copia della cartella anziché il checkout.
Tommie C.,

Grazie per la tua risposta, possiamo immergerci in un ramo? diciamo che voglio scaricare la cartella aaa di feature1 branch
hsafarya,

7

C'è un pacchetto pip Python3 chiamato githubdlche può fare questo *:

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

La pagina del progetto è qui

* Disclaimer: ho scritto questo pacchetto.


6

È uno dei pochi posti in cui SVN è migliore di Git.

Alla fine abbiamo gravitato su tre opzioni:

  1. Usa wget per afferrare i dati da GitHub (usando la visualizzazione dei file non elaborati).
  2. Chiedi ai progetti a monte di pubblicare il sottoinsieme di dati richiesto come artefatti di compilazione.
  3. Rinuncia e usa il checkout completo. È un grande successo nella prima build, ma a meno che non si riceva molto traffico, non è troppo fastidioso nelle build seguenti.

4
Bene, è meno Git vs Subversion e più che GitHub flat-out non consente git-archive. (Mi piacerebbe sapere perché.)
Rob Howard,

6

Se hai dimestichezza con i comandi unix, non hai bisogno di dipendenze speciali o app web per questo. Puoi scaricare il repository come tarball e decomprimere solo ciò di cui hai bisogno.

Esempio (file woff2 da una sottodirectory in fontawesome):

curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3
  • Ulteriori informazioni sul formato del collegamento: https://developer.github.com/v3/repos/contents/#get-archive-link (incluso come ottenere un file zip o rami / riferimenti specifici)
  • Mantenere la parte iniziale del percorso ( */) in modo che corrisponda a qualsiasi directory. Github crea una directory wrapper con il ref di commit nel nome, quindi non può essere conosciuto.
  • Probabilmente vuoi --strip-componentsessere uguale alla quantità di barre ( /) nel percorso (argomento precedente).

Questo scaricherà l'intero tarball. Usa il metodo SVN menzionato nelle altre risposte se questo deve essere evitato o se vuoi essere gentile con i server GitHub.


5

È possibile eseguire un semplice download dell'albero delle directory:

git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -

Ma se intendi verificarlo ed essere in grado di fare commit e respingerli, no non puoi farlo.


1
Comando non valido: 'git-upload-archive' foobar / Test.git '' Sembra che tu stia usando ssh per clonare un URL git: //. Assicurati che l'opzione di configurazione core.gitProxy e la variabile di ambiente GIT_PROXY_COMMAND NON siano impostate. fatale: l'estremità remota ha riattaccato inaspettatamente tar: questo non sembra un tar dell'archivio tar: uscita con stato di errore a causa di errori precedenti
g_inherit

@g_inherit Posso riprodurre questo problema. Sebbene questa potrebbe essere la direzione giusta, questa risposta non è valida.
Uli Köhler,

nonostante così tanti voti negativi, questo è l'unico consiglio che ha funzionato per me.
Bhaskarc,

5

Solo per amplificare le risposte sopra, un vero esempio da un vero repository GitHub a una directory locale sarebbe:

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

A volte un esempio concreto aiuta a chiarire le sostituzioni proposte.


5

Nessuna delle risposte ha aiutato nella mia situazione. Se stai sviluppando per Windows, probabilmente non hai svn. In molte situazioni non si può contare sul fatto che Git sia installato o che non si desideri scaricare interi repository per altri motivi. Alcune delle persone che hanno risposto a questa domanda, come Willem van Ketwich e Aztack, hanno creato strumenti per svolgere questo compito. Tuttavia, se lo strumento non è scritto per la lingua che stai utilizzando o non desideri installare una libreria di terze parti, queste non funzionano.

Tuttavia, esiste un modo molto più semplice. GitHub ha un'API che ti consente di scaricare un singolo file o l'intero contenuto di una directory usando le richieste GET . È possibile accedere a una directory utilizzando https://api.github.com/repos/:owner/:repo_name/contents/:pathche restituisce un oggetto JSON che elenca tutti i file nella directory. Nell'enumerazione è incluso un collegamento al contenuto non elaborato del file, il download_urlparametro. Il file può quindi essere scaricato utilizzando tale URL.

È un processo in due fasi che richiede la possibilità di effettuare richieste GET, ma può essere implementato praticamente in qualsiasi lingua, su qualsiasi piattaforma. Può essere utilizzato per ottenere file o directory.



4

Uso Linux, quindi lo metto in ~ / .bashrc, chiamato pari: D $ HOME / .bashrc

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

}

quindi aggiorna la shell con

source ~/.bashrc 

quindi usalo con git-downloadfolder blablabla: D


3

Lavoro con server CentOS 7 su cui non ho accesso root, né git, svn, ecc. (Né voglio!), Quindi ho creato uno script Python per scaricare qualsiasi cartella github: https://github.com/andrrrl/github -cartella-downloader

L'utilizzo è semplice, basta copiare la parte pertinente da un progetto github, diciamo che il progetto è https://github.com/MaxCDN/php-maxcdn/ e si desidera una cartella in cui sono presenti solo alcuni file sorgente, quindi è necessario fai qualcosa come:

$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(creerà la cartella di destinazione se non esiste)

Richiede la libreria lxml , può essere installata con easy_install lxml
Se non si dispone dell'accesso root (come me) è possibile creare un .pydistutils.pyfile nel proprio$HOME con questi contenuti: [install] user=1 E easy_install lxmlfunzionerà semplicemente (ref: https://stackoverflow.com/a/ 33464597/591257 ).


3

Mancano solo 5 passaggi

1) Scarica SVN da qui .
2) Apri CMD e vai alla directory bin SVN come di seguito:

cd %ProgramFiles%\SlikSvn\bin

3) Supponiamo di voler scaricare l' URL di questa directory 4) Ora sostituisci con 5) Ora attiva l'ultimo comando per scaricare la cartella nella stessa directory.
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


Questo non sembra funzionare per i
repository

Sì, non funzionerà per i respos privati, GIT è consigliato per il download di respo privati.
Muhammad Ali,

2

Per esportare una directory da GitHub, sostituire "/ tree / master /" nell'URL della directory con "/ trunk /".

Ad esempio, per esportare la directory dal seguente URL:

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

eseguire il comando seguente:

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

2

Una semplice risposta a questa è prima tartaruga svn dal seguente link.

https://tortoisesvn.net/downloads.html

mentre l'installazione attiva l'opzione CLI, in modo che possa essere utilizzata dall'interfaccia della riga di comando.

copia il link alla sottodirectory dell'hub git.

Esempio

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

sostituire l'albero / maestro con il tronco

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

e fai

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

i file verranno scaricati nella cartella deeplab nella directory corrente.


2

puoi usare git svn nel modo seguente.

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

In questo modo non devi affrontare il problema di impostare svn, in particolare per gli utenti Windows.


Grazie. Posso garantire che funziona per Windows. Tuttavia, non funziona su gcloud. Dice git: 'svn' non è un comando
JOSEPH Blessingh

sudo apt install git-svnè richiesto quando si esegue WSL.
Jammy Dodger,


1

Utilizzare questa funzione, il primo argomento è l'URL della cartella, il secondo è il luogo in cui la cartella verrà scaricata:

function github-dir() {
    svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"  
}

1

git clone --filter da Git 2.19

Questa opzione salterà effettivamente il recupero di oggetti non necessari dal server:

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

Il server deve essere configurato con:

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

È stata fatta un'estensione al protocollo remoto Git per supportare questa funzione nella v2.19.0, ma al momento non è disponibile alcun supporto server. Ma può già essere testato localmente.

L'ho trattato in modo più dettagliato in: Come posso clonare una sottodirectory solo di un repository Git?


1
Interessante e valorizzato. Suppongo di aver menzionato questa funzione 2.19 altrove.
VonC,

@VonC Penso di averti battuto in questo modo una volta: stackoverflow.com/questions/2466735/… e l'ho visto solo dopo l'uscita XD! Ovviamente stavo cercando su Google oggi un po 'dopo la versione 2.22, tutte le risposte sono già state aggiornate ovviamente ;-) Non smette mai di divertirmi di come rimanga sempre un altro semi-duplicato, sempre, e finisco per trovarlo un anno dopo con una query leggermente diversa. Non ho intenzione di batterti su Git però, troppo forte, ma tieni d'occhio i conteggi del negromante! haha
Ciro Santilli 8 冠状 病 六四 事件 法轮功

Bene, continuate così: tutta la comunità trarrà beneficio da questa piccola competizione laterale (e al momento ho votato la vostra altra risposta)
VonC

@VonC scherzando ovviamente, ho votato anche le tue cose ovviamente. Devo solo trovare un modo per riscattare quei punti in denaro ora XD
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1

Per qualsiasi motivo, la svnsoluzione non funziona per me e poiché non ho bisogno di svnnient'altro, non aveva senso dedicare tempo a provare a realizzarla, quindi ho cercato una soluzione semplice utilizzando gli strumenti che avevo già. Questo script utilizza solo curle awkper scaricare tutti i file in una directory GitHub descritta come"/:user:repo/contents/:path" .

Il corpo restituito di una chiamata al "GET /repos/:user:repo/contents/:path"comando API REST GitHub restituisce un oggetto che include a"download_url" collegamento per ciascun file in una directory.

Questo script da riga di comando chiama l'API REST utilizzando curle invia il risultato tramite AWK, che filtra tutte le righe tranne "download_url", cancella virgolette e virgole dai collegamenti e quindi scarica i collegamenti utilizzando un'altra chiamata per arricciare.

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

1

git sparse-checkout

Git 2.25.0 include un nuovo git sparse-checkoutcomando sperimentale che rende più facile da usare la funzionalità esistente, insieme ad alcuni importanti vantaggi in termini di prestazioni per archivi di grandi dimensioni. ( Il blog di GitHub )

Esempio con la versione corrente :

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

Soprattutto

  • --sparse controlla solo i file di directory di livello superiore di git repository nella copia di lavoro
  • git sparse-checkout add taggiunge / verifica in modo incrementale la tsottocartella digit

Altri elementi

  • git sparse-checkout init fa alcuni preparativi per abilitare checkout parziali
  • --filter=blob:noneottimizza il recupero dei dati scaricando solo gli oggetti git necessari (dai un'occhiata alla funzione di clonazione parziale per ulteriori informazioni)
  • --cone inoltre accelera le prestazioni applicando modelli di inclusione di file più limitati

Stato GitHub

GitHub sta ancora valutando questa funzionalità internamente mentre è abilitata su alcuni repository selezionati [...]. Man mano che la funzionalità si stabilizza e matura, ti terremo aggiornato con i suoi progressi. ( documenti )


Upvoted. Ho presentato quel comando in stackoverflow.com/a/59515426/6309 , con il modello di clone impostato.
VonC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.