2009-10-23 3 views
14

Ho appena iniziato con git e ho una domanda. La mia app ha altri 10 sviluppatori che lavorano su di essa, ognuno con il proprio ramo come dev_XXXXX. Quindi se faccio un clone del repository, tutto il loro codice viene copiato sul mio computer? In tal caso non lo voglio. Supponiamo che il mio ramo sia dev_swamy, come faccio a clonare solo il ramo stabile e dev_swamy? Grazie.Clona solo la stalla e un altro ramo in git?

risposta

23

Per default git clone sarebbe prendere tutti i rami, ma quei rami sarebbero memorizzati come rami remote-inseguimento: per esempio ramo 'dev_XXXXX' verrebbe memorizzata come 'origine/dev_XXXXX' (con 'refs/remotes/origine/dev_XXXXX 'come nome completo). Tali rami di tracciamento remoto non sarebbero visibili nell'output git branch: sarà necessario git branch -r per elencare i rami di tracciamento remoto (o git branch -a per elencare tutti i rami). Se quei rami non divergono troppo dalla linea principale, non prenderebbero troppo spazio nel repository. Quindi non vedo perché vuoi clonare solo i rami selezionati.

Tuttavia, se si vuole avere un clone con solo due filiali selezionate, si può fare in questo modo:

  1. In primo luogo, creare nuovo repository vuota

    $ mkdir repoclone 
    $ cd repoclone/ 
    $ git init 
    Initialized empty Git repository in /home/user/repoclone/.git/ 
    
  2. Allora aggiungi la tua repository sotto il nome di "origine" (proprio come "git clone" lo chiamerebbe), richiedendo il monitoraggio di due soli rami: "master" e "dev_swamy", usando il comando "git remote". Verifica che sia stato aggiunto correttamente.

    $ git remote add -t master -t dev_swamy origin [email protected]:repo.git 
    $ git remote 
    origin 
    $ git remote show origin 
    * remote origin 
        Fetch URL: [email protected]:repo.git 
        Push URL: [email protected]:repo.git 
        HEAD branch: master 
        Remote branches: 
        master   new (next fetch will store in remotes/origin) 
        dev_swamy new (next fetch will store in remotes/origin) 
    

    Se il ramo stabile si chiama 'stabile', piuttosto che 'master', si dovrebbe ovviamente modificare sopra esempio. Inoltre, è disponibile l'opzione -m <branch> se si desidera che il ramo specificato sia il ramo predefinito in remoto.

  3. Fetch da 'origine' (si potrebbe fare questo anche usando -f opzione "git remote add" sopra):

    $ git fetch 
    remote: Counting objects: 282, done. 
    remote: Compressing objects: 100% (193/193), done. 
    remote: Total 282 (delta 82), reused 0 (delta 0) 
    Receiving objects: 100% (282/282), 81.30 KiB | 135 KiB/s, done. 
    Resolving deltas: 100% (82/82), done. 
    From [email protected]:repo.git 
    * [new branch]  master  -> origin/master 
    * [new branch]  dev_swamy -> origin/dev_swamy 
    From [email protected]:repo.git 
    * [new tag]   v1.0  -> v1.0 
    * [new tag]   v1.0.1 -> v1.0.1 
    * [new tag]   v1.1  -> v1.1 
    
  4. Impostare filiale locale 'master' (dove si dovrebbe fare la tua di lavoro) a seguire 'origin/master' (per avere 'origin/master' come a monte), proprio come "git clone" avrebbe fatto:

    $ git checkout -t origin/master 
    Branch master set up to track remote branch master from origin. 
    Already on 'master' 
    

    È possibile ripetere questo per ramo 'dev_swamy'.

  5. Ora è possibile vedere come appare il file di configurazione. È possibile ottenere esattamente lo stesso risultato modificando il file .git/config in modo che assomigli al seguente e quindi facendo "git fetch".

    $ cat .git/config # or just open this file in your editor 
    [core] 
         repositoryformatversion = 0 
         filemode = true 
         bare = false 
         logallrefupdates = true 
    [remote "origin"] 
         url = [email protected]:repo.git 
         fetch = +refs/heads/master:refs/remotes/origin/master 
         fetch = +refs/heads/dev_swamy:refs/remotes/origin/dev_swamy 
    [branch "master"] 
         remote = origin 
         merge = refs/heads/master 
    

Non dimenticare di presentarti ai Git prima di iniziare a lavorare sul repository (vale a dire insieme 'user.name' e 'user.email' variabili di configurazione, di solito nel file di configurazione per utente)!

4

Se si clona, ​​tutte le revisioni in tutti i rami sono clonati lungo, ma il repository clonato sarà controllare maestro per impostazione predefinita.

Solo prendendo filiali selezionate è più complicato dal momento che git in realtà non credo che si dovrebbe lavorare in questo modo. Bisogna abbattere i rami manualmente:

mkdir repoclone 
cd repoclone 
git init 
git remote add origin git://remote/url 
git fetch origin master:master 
git fetch origin dev_XXX:dev_XXX 

Sopra è quello che sapevo lavorato. Tuttavia, se si desidera impostare un repository git che funzioni normalmente, ha solo una visione più ristretta delle sue diramazioni remote? Si può fare abbastanza facilmente:

mkdir repoclone 
cd repoclone 
git init 
git remote add origin git://remote/url 

# now open .git/config for editing in your editor 
# replace the following line (grab all remote branches) 
fetch = +refs/heads/*:refs/remotes/origin/* 

# replace with lines listing exactly which branches you want 
fetch = +refs/heads/master:refs/remotes/origin/master 
fetch = +refs/heads/dev_XXX:refs/remotes/origin/dev_XXX 

# save the file, now run 

git fetch 
+0

Aha! Questo è qualcosa a cui ho pensato per un po '- c'è un modo per clonare solo un ramo. Un'idea interessante per accenderla è andare a testa e recuperare solo ciò di cui hai bisogno. Ma il primo recupero genera questo errore: "fatale: Rifiutarsi di recuperare nel corrente branch ref/head/master del repository non nudo" –

+0

BTW con git moderno puoi usare 'git init repoclone' –

+0

@Steve: Ah, hai ragione . È possibile sostituire con "' git fetch origin master, git reset --hard FETCH_HEAD' "per impostare il master. – u0b34a0f6ae

0

penso che la questione più importante è quello che gli altri saranno spingendo, non ciò che vi verrà clonando o tirare. Dal momento che ogni sviluppatore sta lavorando sul proprio ramo, un'altra domanda è come si finisce con una base di codice comune. Gli sviluppatori stanno fondendo le loro filiali per padroneggiare? E stanno quindi spingendo il loro ramo master modificato in un repository centrale? In tal caso, non è comunque possibile per te estrarre le filiali degli altri sviluppatori.

Se questo non è il caso, non riesco a vedere come è possibile formare una squadra funzionamento.

E come ho pensiero finale: Sarei curioso di sapere il motivo per cui non si vuole clonare rami degli altri sviluppatori al repository?

0

Un altro modo per farlo è quello di evitare un clone diretta, ma invece aggiungere manualmente una distanza con un set personalizzato di recupero refspecs.

ad es.

mkdir myclone 
cd myclone 
git init 

git remote add origin url://origin.repo 

# Add fetch rules for the branches that we want to track 
git config remote.origin.fetch +refs/heads/master:+refs/remotes/origin/master 
git config --add remote.origin.fetch +refs/heads/dev_swamy:+refs/remotes/origin/dev_swamy 

# fetch now fetches just what we need, subsequently it will do incremental fetches 
git fetch 

# Creating local branches tracking the remote branches 
git checkout -b master origin/master 
git branch dev_swamy origin/dev/swamy