Domanda Fai un "git export" (come "svn export")?


Mi sono chiesto se esiste una buona soluzione "git export" che crea una copia di un albero senza il .git directory del repository. Ci sono almeno tre metodi che conosco:

  1. git clone seguito dalla rimozione del .git directory del repository.
  2. git checkout-index allude a questa funzionalità ma inizia con "Basta leggere l'albero desiderato nell'indice ..." che non sono del tutto sicuro di come fare.
  3. git-export è uno script di terze parti che essenzialmente fa a git clone in una posizione temporanea seguita da rsync --exclude='.git' nella destinazione finale.

Nessuna di queste soluzioni mi sembra davvero soddisfacente. Il più vicino a svn export potrebbe essere l'opzione 1, perché entrambi richiedono che la directory di destinazione sia vuota per prima. Ma l'opzione 2 sembra ancora migliore, assumendo che io possa capire cosa significa leggere un albero nell'indice.


2165
2017-10-02 02:21


origine


risposte:


Probabilmente il modo più semplice per ottenere questo è con git archive. Se hai davvero bisogno solo dell'albero espanso puoi fare qualcosa di simile.

git archive master | tar -x -C /somewhere/else

La maggior parte delle volte che ho bisogno di "esportare" qualcosa da git, voglio comunque un archivio compresso, quindi faccio qualcosa di simile.

git archive master | bzip2 >source-tree.tar.bz2

Archivio ZIP:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive per maggiori dettagli, è abbastanza flessibile.


Tieni presente che anche se l'archivio non contiene la directory .git, tuttavia, contiene altri file specifici di git nascosti come .gitignore, .gitattributes, ecc. Se non li vuoi nell'archivio, assicurati di usa l'attributo export-ignore in un file .gitattributes e confermalo prima di fare l'archivio. Leggi di più...


Nota: se sei interessato ad esportare l'indice, il comando è

git checkout-index -a -f --prefix=/destination/path/

(Vedere La risposta di Greg per ulteriori dettagli)


2195
2017-10-02 18:13



Ho scoperto che cosa significa l'opzione 2. Da un repository, puoi fare:

git checkout-index -a -f --prefix=/destination/path/

La barra alla fine del percorso è importante, altrimenti i file saranno in / destinazione con un prefisso 'percorso'.

Poiché in una situazione normale l'indice contiene il contenuto del repository, non c'è nulla di speciale da fare per "leggere l'albero desiderato nell'indice". È già lì.

Il -a flag è necessario per controllare tutti i file nell'indice (non sono sicuro di cosa significa omettere questo flag in questa situazione, poiché non fa ciò che voglio). Il -f le flag force sovrascrivono qualsiasi file esistente nell'output, cosa che normalmente questo comando non esegue.

Questo sembra essere il tipo di "esportazione di git" che stavo cercando.


301
2017-10-02 03:03



git archive funziona anche con repository remoto.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

Per esportare un percorso particolare all'interno del repository, aggiungi tutti i percorsi che desideri come ultimo argomento a git, ad esempio:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

241
2017-12-09 18:59



enter image description here

Una risposta caso speciale se il repository è ospitato su GitHub.

Basta usare svn export.

Per quanto ne so, Github non consente archive --remote. Anche se GitHub è compatibile con svn e hanno tutti i repository git svn accessibile in modo che tu possa semplicemente usare svn export come faresti normalmente con alcune modifiche al tuo URL GitHub.

Ad esempio per esportare un intero repository, nota come trunknell'URL si sostituisce master (o qualunque sia il il ramo HEAD del progetto è impostato su):

svn export https://github.com/username/repo-name/trunk/

Ed è possibile esportare un singolo file o anche un determinato percorso o cartella:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

Esempio con jQuery JavaScript Library

Il HEAD ramo o maestro ramo sarà disponibile utilizzando trunk:

svn ls https://github.com/jquery/jquery/trunk

Il non-HEAD  rami sarà accessibile sotto /branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

Tutti tag sotto /tags/ nello stesso modo:

svn ls https://github.com/jquery/jquery/tags/2.1.3

48
2017-10-30 17:03



Dal Manuale Git:

Usare git-checkout-index per "esportare un intero albero"

L'abilità prefisso rende fondamentalmente semplice usare git-checkout-index come una funzione "esporta come albero". Basta leggere l'albero desiderato nell'indice e fare:

$ git checkout-index --prefix=git-export-dir/ -a


38
2017-10-02 02:27



Ho scritto un semplice wrapper in giro git-checkout-index che puoi usare in questo modo:

git export ~/the/destination/dir

Se la directory di destinazione esiste già, dovrai aggiungere -f o --force.

L'installazione è semplice; lascia cadere lo script da qualche parte nel tuo PATHe assicurati che sia eseguibile.

Il repository github per git-export 


37
2017-10-16 17:17



Sembra che questo sia meno un problema con Git che SVN. Git mette solo una cartella .git nella root del repository, mentre SVN inserisce una cartella .svn in ogni sottodirectory. Quindi "svn export" evita la magia ricorsiva della riga di comando, mentre con Git la ricorsione non è necessaria.


35
2018-05-12 04:20



L'equivalente di

svn export . otherpath

all'interno di un repository esistente è

git archive branchname | (cd otherpath; tar x)

L'equivalente di

svn export url otherpath

è

git archive --remote=url branchname | (cd otherpath; tar x)

26
2018-02-23 15:41



Uso ampiamente i sottomodelli git. Questo funziona per me:

rsync -a ./FROM/ ./TO --exclude='.*'

21
2017-09-13 06:26



Se non si escludono i file con .gitattributes  export-ignore quindi prova git checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f
  Durante il check-out dei percorsi dall'indice, non fallire una volta separati   inserimenti; invece, le voci non raggruppate vengono ignorate.

e

-q
  Evitare di verboso

Inoltre è possibile ottenere qualsiasi Branch o Tag o da una Revisione di commit specifica come in SVN aggiungendo semplicemente SHA1 (SHA1 in Git è l'equivalente del numero di revisione in SVN)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

Il /path/to/checkout/ deve essere vuoto, Git non cancellerà alcun file, ma sovrascriverà i file con lo stesso nome senza alcun avviso

AGGIORNARE: Per evitare il problema della decapitazione o lasciare intatto il repository funzionante quando si usa il checkout per esportare con tag, rami o SHA1, è necessario aggiungere -- ./ alla fine

Il doppio trattino -- dice a Git che tutto ciò che segue i trattini sono percorsi o file, e anche in questo caso dice git checkout non cambiare il HEAD

Esempi:

Questo comando otterrà solo la directory libs e anche il readme.txt file da quello esattamente commit

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

Questo creerà (sovrascrivi) my_file_2_behind_HEAD.txt due si commettono dietro la testa HEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

Per ottenere l'esportazione di un altro ramo

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

Notare che ./ è relativo alla radice del repository


20
2017-12-10 17:17