2012-03-07 22 views
38

Vorrei esportare dal repository remoto github, non clonarlo. Simile all'esportazione svn, non voglio ottenere la cartella .git con esso. Posso aggirarlo clonando e rimuovendo la cartella .git. Mi chiedo se c'è un modo più pulito?esportazione git dal repository remoto github

L'ho letto da qualche parte è possibile utilizzare l'archivio git per raggiungere questo obiettivo.

Tuttavia ho ottenuto le seguenti errori ..

$ git archive --format=tar [email protected]:xxx/yyy.git master | tar -xf - 

Invalid command: 'git-upload-archive 'xxx/yyy.git'' 
You appear to be using ssh to clone a git:// URL. 
Make sure your core.gitProxy config option and the 
GIT_PROXY_COMMAND environment variable are NOT set. 
fatal: The remote end hung up unexpectedly 

Qualsiasi aiuto sarebbe grande. Grazie.

risposta

6

Se il tuo obiettivo è limitare la quantità di informazioni scambiate con il server, hai considerato l'utilizzo di clone con --depth? Si avrebbe ancora bisogno di rimuovere la (molto ridotta) .git sottodirectory però:

git clone --depth=1 [email protected]:xxx/yyy.git && rm -rf yyy/.git 
+0

Buona idea. Sarà più bello se potessi semplicemente "esportarlo" :) –

+0

Se sei in zsh puoi farlo: https://gist.github.com/johnhamelink/5434938 –

-4

Per un normale esportazione:

$ git archive master | tar -x -C /path/to/destination 

Per un archivio zip:

$ git archive --format zip --output /path/to/destination/file.zip master 

Ovviamente, per far funzionare tutto questo, dovrai prima clonarlo localmente, non c'è lo pulire in questo modo.

+0

@AdrianGunawan Non sarai in grado di esportare it _directly_ da GitHub, devi prima clonarlo localmente. Dopo averlo clonato localmente, 'master' si riferisce al nome del ramo. –

+2

Downvoted per trascurare il punto cruciale della domanda come indicato e intitolato. – danorton

7

Se si è interessati solo all'esportazione da GitHub, forniscono un meccanismo per scaricare i tarball. Per esempio:

https://github.com/torvalds/linux/downloads

Anche se si dice "non ci sono file per questo repository." puoi ancora usare i pulsanti per scaricare un tarball del ramo principale.

O vedere questo link per un elenco di tarballs legati al tag:

https://github.com/torvalds/linux/tags

Questo dovrebbe funzionare per qualsiasi repo GitHub, non solo il kernel linux.

+1

Sarebbe utile se funzionasse per qualsiasi repository git, non solo github. –

3

Se avete bisogno di questo per commit nome (cioè rami e tag), quindi è possibile utilizzare git clone --depth=1 combinato con git archive

Vale la pena di sapere che git clone --depth=1 cloni tutto top impegna su tutti i rami e tag (non solo master). Quindi, dopo aver fatto un clone così superficiale, puoi inserire la directory locale e creare un git archive --format=tar tag_to_be_exported.

Quindi, se si desidera esportare il tag release1.1

git clone --depth=1 [email protected]:xxx/yyy.git 
cd yyy 
git archive --format=tar release1.1 -o release1.1.tar 

Così unnless è necessario esportare senza nome commettere-ID, questo può essere una buona soluzione.

+1

È interessante menzionare l'argomento "tutti i rami e le etichette". In effetti si potrebbe voler esportare un ramo leggero in un deposito altrimenti enorme. Eppure nel mio git (1.9.1) 'man git-clone' ha l'opzione' - [no-] single-branch' "Clona solo la storia che porta alla punta di un singolo ramo" e "Quando si crea un clone superficiale con l'opzione --depth, questa è l'impostazione predefinita, a meno che non venga fornito --no-single-branch per recuperare le cronologie vicino ai suggerimenti di tutti i rami. " –

+0

@ StéphaneGourichon Sì, i valori predefiniti sono cambiati da quando questa risposta è stata pubblicata: http://stackoverflow.com/a/9920956/239408 – xverges

50

Grazie al supporto Subversion da GitHub, è possibile utilizzare svn export per ottenere il progetto senza alcun file di controllo versione:

svn export https://github.com/user/project/trunk 

Avviso formato URL:

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

In questo modo è possibile ottenere i rami e le sottodirectory troppo.

Questo crea una directory con i file esportati. Non è possibile creare direttamente un tar/zip, devi fare in due passaggi (export + zip). Questa è una limitazione di svn export stesso.

Come indicato da @Jon, ciò creerà l'esportazione in una directory denominata trunk per impostazione predefinita. È possibile specificare un nome diverso se si preferisce:

svn export https://github.com/username/projectname/trunk projectname 

È possibile utilizzare questa tecnica per esportare qualsiasi sottodirectory del progetto. Per esempio se desideri solo some/path, si può fare:

svn export https://github.com/username/projectname/trunk/some/path local-dir-name 

È possibile ottenere i percorsi da rami e tag troppo. L'endpoint https://github.com/username/projectname si comporta completamente come un repository di Subversion con un layout normale, quindi troverete le diramazioni in https://github.com/username/projectname/branches e i tag in https://github.com/username/projectname/tags.

Prima di esportare qualcosa di grosso per errore, è bene controllare prima il contenuto del percorso. È possibile farlo usando svn ls, ad esempio:

svn ls https://github.com/username/projectname/ 

Normalmente questo dovrebbe darvi:

branches/ 
tags/ 
trunk/ 

Si potrebbe iterativo esplorare il repository in questo modo.

+0

Funziona come un fascino –

+3

OTTIMA soluzione. Una cosa da notare è che questo creerà una directory radice chiamata 'trunk' di default. Per evitare ciò, basta specificare un nome alternativo, come questo: 'svn export https: // github.com/username/nome progetto/trunk projectname' – Jon

+1

Grazie @Jon, ho aggiunto la tua nota alla mia risposta! – janos

1

Mi sono imbattuto in questo stesso problema prima, e AFAICT, sembra funzionare solo con Bitbucket, ad es.

ysim:~/repos$ git archive --format=tar --prefix=alembic/ --remote=ssh://[email protected]/zzzeek/alembic.git master | tar -xf - 
ysim:~/repos$ ls 
alembic 

Ma ho trovato una soluzione per GitHub utilizzando wget - così nella nuova interfaccia GitHub, troverete un pulsante che dice "Download ZIP" sulla parte inferiore della barra laterale destra; fare clic destro su di esso e copiare l'indirizzo del link.

Download ZIP

Avanti, nella riga di comando (ho preso l'idea da here):

wget -qO- -O tmp.zip <zipball url> && unzip tmp.zip && rm tmp.zip 

Che vi decomprimerlo in una directory chiamata qualcosa come repo-master/.

Se lo desideri, puoi anche farlo alias nel tuo .gitconfig in modo da non doverlo ricordare/digitare tutto ciò, ad es.

export = "! f() { wget -qO- -O tmp.zip \"$1\" && unzip tmp.zip && rm tmp.zip; }; f" 

Così si può semplicemente fare qualcosa di simile nella shell:

ysim:~/repos$ git export https://github.com/ysim/verbinski/archive/master.zip 
ysim:~/repos$ ls 
verbinski-master 
0

Un modo per raggiungere questo obiettivo è quello di utilizzare il supporto offerto da SVN GIT.

I passaggi per eseguire come root uno spento sono (per Cent os);

yum install git 

yum install subversion 

Quindi per fare un export selettivo la seguente sintassi dovrebbe essere utilizzato:

svn export <git repository>/<source folder> <empty target folder> --no-auth-cache --force --username <active directory username> 

Se non si utilizza il parametro --no-auth-cache quando viene richiesto di salvare il tipo di password "no" per motivi di sicurezza, o sarà salvato in chiaro.

Durante la conversione dalla notazione GIT alla notazione SVN si applica la seguente mappatura; sostituire "albero/master" con "trunk" per il master sostituire "tree/branch_name" con "branches/branch_name" per i rami

Questo funziona sia per i file che per le directory.

3

Per motivi sconosciuti (almeno per me) GitHub doesn't support this.

We don’t support people running git-archive against our servers. 

sembra sciocco, dal momento che via SVN è possibile, ma ... io upvoted @Janos' answer.

Problemi correlati