2010-11-06 9 views
115

Sto lavorando con un repository con un numero molto elevato di file che richiede ore per il checkout. Sto esaminando la possibilità di se Git avrebbe funzionato bene con questo tipo di repository ora che supporta casse sparse, ma tutti gli esempi che posso trovare esegue le seguenti operazioni:È possibile eseguire un checkout sparse senza prima verificare l'intero repository?

git clone <path> 
git config core.sparsecheckout true 
echo <dir> > .git/info/sparse-checkout 
git read-tree -m -u HEAD 

Il problema con questa sequenza di comandi è il clone originale fa anche un checkout. Se si aggiunge -n per il comando originale clone, allora il comando risultati in lettura-albero nella seguente errore:

errore: cassa Sparse lascia alcuna voce nella directory

lavoro Come può fare il checkout sparse senza verificare prima tutti i file?

+3

possibile duplicato del [C'è un modo per clonare solo sottodirectory di un repository git?] (Http://stackoverflow.com/questions/600079/is-there-any-way-to-clone- a-git-repositorys-sub-directory-only) – Chronial

+0

Nota: 'git worktree add --no-checkout' funzionerà anche (non solo' git clone --no-checkout') con git 2.9 (Solo 2016). Vedi [la mia risposta sotto] (http://stackoverflow.com/a/36615363/6309) – VonC

risposta

106

Prova questo:

mkdir myrepo 
cd myrepo 
git init 
git config core.sparseCheckout true 
git remote add -f origin git://... 
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout 
git checkout [branchname] # ex: master 

Ora vi accorgerete che avete una cassa "potato" con solo file da percorso/within_repo/a/desired_subdir presente (e in questo percorso).

Si noti che sulla linea di comando di Windows non si deve citare il percorso, vale a dire è necessario modificare il 6 ° comando con questo:

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout 

se non si otterrà le quotazioni in il file sparse-checkout, e non funzionerà

+0

nota, sono richieste le barre in avanti (il relativo repo git centrico) anche su Windows. quindi percorso/to/sottodir/* NON percorso \ a \ sottodir \ * –

+0

Nella mia prima esperienza che non funziona, ho usato 'echo path/to/subdir/* >> .git/info/sparse-checkout', nota Non ho usato virgolette singole per citare il percorso e c'è uno spazio extra dopo '*', ecco perché non funziona, la rimozione manuale dello spazio in sparse-checkout ha risolto il problema. BTW io sono su Windows. – wangzq

+3

Non riesco a usare il comando "git checkout [branchname]" (errore trovato anche: checkout sparse non lascia alcuna voce sulla directory di lavoro). Ho usato "git pull origin master" e funziona correttamente. – Natty

3

Sono nuovo di git, ma sembra che se faccio git checkout per ogni directory, allora funziona. Inoltre, il file di sparse-checkout deve avere una barra finale dopo ogni directory come indicato. Qualcuno di più esperienza si prega di confermare che questo funzionerà.

È interessante notare che se si esegue il checkout di una directory non presente nel file di sparse-checkout non sembra fare alcuna differenza. Non si presentano nello stato git e git read-tree -m -u HEAD non ne causa la rimozione. git reset --hard non causa la rimozione della directory. Qualcuno più esperto cura di commentare ciò che git pensa di directory che sono state controllate ma che non sono nel file di pagamento sparse?

27

clone Git ha un'opzione (--no-checkout o -n) che fa quello che vuoi.

Nel vostro elenco di comandi, basta cambiare:

git clone <path> 

A tal:

git clone --no-checkout <path> 

è quindi possibile utilizzare la cassa sparse come indicato nella domanda.

+4

sì, non fa un checkout, ma fa ancora un recupero per scaricare l'intera cronologia dei pronti contro termine –

+4

@JasonS la domanda riguardava specificamente il mancato pagamento. Se non vuoi che tutta la cronologia usi l'opzione '--depth ' su git clone. Questo scaricherà solo l'ultimo '' dalla cronologia. Al momento non è possibile scaricare parzialmente un singolo commit con git, anche se il tuo telecomando lo supporta puoi usare 'git archive --remote' per scaricare gruppi parziali di file. – onionjake

6

Purtroppo nessuno dei precedenti ha funzionato per me, quindi ho impiegato molto tempo a provare una combinazione diversa del file sparse-checkout.

Nel mio caso, ho voluto saltare le cartelle con le configurazioni IDEA IntelliJ.

Ecco quello che ho fatto:


Run git clone https://github.com/myaccount/myrepo.git --no-checkout

Run git config core.sparsecheckout true

Creato .git\info\sparse-checkout con i seguenti contenuti

!.idea/* 
!.idea_modules/* 
/* 

Run 'git checkout -' per ottenere tutti i files.


cosa fondamentale per rendere il lavoro è stato quello di aggiungere /* dopo il nome della cartella.

ho git 1.9

+0

Funziona. Ho git 1.7.1 – tangxinfa

+3

No, scarica ancora tutto, tutti i commit e tutti i file, git 2.3.2 – Tyguy7

+4

Checkout sparsi riguardano solo l'albero di lavoro. Non influenzano la dimensione del repository o ciò che viene recuperato. Hai bisogno di diverse opzioni se lo vuoi. – Miral

8

ho trovato la risposta che cercavo da one-liner postato in precedenza da Pavek (grazie!), Così ho voluto fornire una risposta completa in un'unica risposta che funziona su Linux (GIT 1.7.1):

1--> mkdir myrepo 
2--> cd myrepo 
3--> git init 
4--> git config core.sparseCheckout true 
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout 
6--> git remote add -f origin ssh://... 
7--> git pull origin master 

ho cambiato l'ordine dei comandi un po ', ma che non sembra avere alcun effetto. La chiave è la presenza della barra finale "/" alla alla fine del percorso nel passaggio 5.

+3

sei sicuro che questo è quello che vuoi? il -f indica il recupero di tutti i dati, ottieni comunque tutte le altre informazioni che non vuoi ed è lento. (Questo è ancora "verificando l'intero repository") – Shuman

+1

Ho provato i passaggi sopra in Windows ma il checkout di riserva non funziona nel prompt dei comandi, quindi ho provato la shell Git Bash e ha funzionato !!. il prompt dei comandi è in grado di eseguire tutti i comandi git come push, pull, ecc. ma quando si tratta di sparse checkout fallisce. – user593029

+0

Come fare solo i file della sottodirectory. Voglio solo recuperare i file all'interno della sottodirectory specifica. –

3

GIT 2.9 (giugno 2016) sarà generalizzare la --no-checkout opzione git worktree add (il comando che consente di opere con multiple working trees for one repo)

Vedi commit ef2a0ac (29 marzo 2016) da Ray Zhang (OneRaynyDay).
Helped-by: Eric Sunshine (sunshineco) e Junio C Hamano (gitster).
(fusa per Junio C Hamano -- gitster -- in commit 0d8683c 13 Apr 2016)

Il git worktree man page include ora:

--[no-]checkout: 

By default, add checks out <branch> , however, --no-checkout can be used to suppress checkout in order to make customizations, such as configuring sparse-checkout.

0

Sì, radi-checkout scaricare tutta la roba per scaricare una cartella da Git. Nessuno dei metodi sopra descritti funziona per me. Per downlaod solo un singolo campione https://github.com/gearvrf/GearVRf-Demos qui è quello che ho fatto ..

  1. Per le finestre utente scarica e installa SlikSvn_x84, aggiungere questo "C: \ Program Files (x86) \ SlikSvn \ bin" per variabile di ambiente Path . utente mac usa client svn alternativo.

  2. linea Usare comando: svn export https://github.com/foobar/Test.git/trunk/foo

Avviso formato URL:

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

Esempio: svn export https://github.com/gearvrf/GearVRf-Demos.git/trunk/gvr-renderableview

I spero che questo aiuti qualcuno. ref: https://stackoverflow.com/a/18324458/5710872

7

Avevo un caso d'uso simile, tranne che volevo controllare solo il commit per un tag e potare le directory. L'utilizzo di --depth 1 lo rende davvero scarso e può davvero velocizzare le cose.

mkdir myrepo 
cd myrepo 
git init 
git config core.sparseCheckout true 
git remote add origin <url> # Note: no -f option 
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout 
git fetch --depth 1 origin tag <tagname> 
git checkout <tagname> 
+2

- il primo è chiamato clone superficiale, solo FYI. –

Problemi correlati