Clonare solo la scuderia e un altro ramo in git?
Domanda
Ho appena iniziato con Git e ho una domanda.Sulla mia app ci lavorano altri 10 sviluppatori, ognuno con il proprio ramo come dev_XXXXX.Quindi, se eseguo un clone del repository, tutto il codice viene copiato sul mio computer?In tal caso non lo voglio.Supponiamo che il mio ramo sia dev_swamy, come posso quindi clonare solo il ramo stabile e dev_swamy?Grazie.
Soluzione
Per impostazione predefinita git clone
recupererebbe tutti i rami, ma tali rami verrebbero archiviati come rami di monitoraggio remoto:ad esempio il ramo 'dev_XXXXX' verrebbe archiviato come 'origin/dev_XXXXX' (con 'refs/remotes/origin/dev_XXXXX' come nome completo).Quelle filiali di tracciamento remoto non sarebbero visibili git branch
produzione:avresti bisogno git branch -r
per elencare le filiali di monitoraggio remoto (o git branch -a
per elencare tutte le filiali).Se questi rami non divergessero troppo dalla linea principale, non occuperebbero troppo spazio su disco nel repository.Pertanto non vedo perché vuoi clonare solo i rami selezionati.
Tuttavia se vuoi avere un clone con solo due rami selezionati, puoi farlo in questo modo:
Innanzitutto, crea un nuovo repository vuoto
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
Quindi aggiungi il tuo repository sotto il nome 'origin' (proprio come lo chiamerebbe "git clone"), richiedendo il tracciamento di soli due rami:'master' e 'dev_swamy', utilizzando "git remoto"comando.Controlla che sia stato aggiunto correttamente.
$ git remote add -t master -t dev_swamy origin user@example.com:repo.git $ git remote origin $ git remote show origin * remote origin Fetch URL: user@example.com:repo.git Push URL: user@example.com: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 "stable" anziché "master", dovresti ovviamente modificare l'esempio precedente.Inoltre c'è
-m <branch>
opzione se si desidera che il ramo specificato sia il ramo predefinito in remoto.Recupera da 'origin' (puoi farlo anche usando
-f
opzione per "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 user@example.com:repo.git * [new branch] master -> origin/master * [new branch] dev_swamy -> origin/dev_swamy From user@example.com:repo.git * [new tag] v1.0 -> v1.0 * [new tag] v1.0.1 -> v1.0.1 * [new tag] v1.1 -> v1.1
Imposta il ramo locale 'master' (dove svolgeresti il tuo lavoro) per seguire 'origin/master' (per avere 'origin/master' come upstream), proprio come farebbe "git clone":
$ git checkout -t origin/master Branch master set up to track remote branch master from origin. Already on 'master'
Puoi ripetere l'operazione per il ramo 'dev_swamy'.
Ora puoi vedere come appare il file di configurazione. Puoi ottenere esattamente lo stesso risultato modificando
.git/config
file in modo che assomigli al seguente, quindi esegui "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 = user@example.com: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 a Git prima di iniziare a lavorare sul repository (es.impostare le variabili di configurazione 'user.name' e 'user.email';di solito nel file di configurazione per utente)!
Altri suggerimenti
Se cloni, tutte le revisioni in tutti i rami vengono clonate insieme, ma il repository clonato controllerà il master per impostazione predefinita.
Basta prendere i rami selezionati è più complicato poiché git non pensa davvero che dovresti lavorare in quel modo. Devi abbattere manualmente i rami:
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 è ciò che sapevo funzionasse. Tuttavia, se vuoi impostare un repository git che funzioni normalmente, hai solo una visione più ristretta dei suoi rami remoti? Puoi farlo 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
Un altro modo per farlo è quello di evitare un clone diretto, ma invece di aggiungere manualmente un telecomando con un set personalizzato di recuperi refspecs
per 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
Penso che la domanda più importante qui sia cosa spingerà gli altri, non cosa clonerai o tirerai. Poiché ogni sviluppatore sta lavorando sul proprio ramo, un'altra domanda è come si finisce con una base di codice comune. Gli sviluppatori stanno unendo i loro rami per dominare? E stanno quindi spingendo il loro ramo master modificato in un repository centrale? In tal caso, non è possibile estrarre comunque i rami degli altri sviluppatori.
In caso contrario, non riesco a vedere come è possibile formare un team funzionante.
E come ho pensato per ultimo: sarei curioso di sapere perché non vorresti clonare i rami degli altri sviluppatori nel tuo repository?