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
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:
In primo luogo, creare nuovo repository vuota
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
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.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
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'.
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)!
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
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?
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
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" –
BTW con git moderno puoi usare 'git init repoclone' –
@Steve: Ah, hai ragione . È possibile sostituire con "' git fetch origin master, git reset --hard FETCH_HEAD' "per impostare il master. – u0b34a0f6ae