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.

È stato utile?

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:

  1. Innanzitutto, crea un nuovo repository vuoto

    $ mkdir repoclone
    $ cd repoclone/
    $ git init
    Initialized empty Git repository in /home/user/repoclone/.git/
    
  2. 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.

  3. 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
    
  4. 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'.

  5. 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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top