Come posso recuperare solo un ramo di un repository Git remoto?


247

Vorrei prendere un singolo ramo (non tutti) di un repository remoto e creare un ramo di tracciamento locale in grado di tracciare ulteriori aggiornamenti a quel ramo remoto. Gli altri rami nel repository remoto sono molto grandi, quindi vorrei evitare di recuperarli. Come faccio a fare questo?

Modifica: l'ho capito da solo, ma StackOverflow rifiuta di farmi fornire la risposta come risposta, quindi la inserirò qui nella domanda.

Si utilizza l'opzione -t per accedere in remoto, ad esempio:

git remote add -t remote-branch remote-name remote-url

È possibile utilizzare più " -t branch" opzioni per afferrare più rami.


3
Un clone git recupera l'intero repository, inclusi tutti i rami. È possibile eseguire copie superficiali, ma ciò consente solo di specificare il numero di revisioni, non i rami.
Ikke,

Sicuro che puoi rispondere alla tua domanda, perché non puoi?
Charles B

2
Penso che l'OP abbia significato che non poteva rispondere allora. StackOverflow imposta un tempo minimo che deve trascorrere prima che tu possa rispondere alla tua domanda.
Lars Nordin,

1
Ciao OP, ora potrebbe essere carino aggiungere la tua risposta. In questo modo possiamo votare (e confrontare con altre risposte)
lulalala

3
Il comando git remote add sta aggiungendo un ramo remoto, che non ha nulla a che fare con il recupero di un ramo!
Chris Halcrow,

Risposte:


220
git fetch <remote_name> <branch_name>

Ha funzionato per me.


14
Ho appena appreso che il ramo recuperato è disponibile come FETCH_HEADdopo il recupero. Grazie!
Christoph,

4
quindi git checkout FETCH_HEADal checkout
d9k

Semplice e facile.
gsumk,

Come ottenere <remote_name>?
mrgloom,

@mrgloom nella maggior parte dei casi remote_nameè origin. ad esempio:git fetch origin <branch_name>
Saahithyan Vigneswaran il

67

Un modo è il seguente:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

Questo però non imposta il tracciamento.

Per ulteriori informazioni, consultare la documentazione di git fetch .

MODIFICA : Come osserva @ user1338062 di seguito : se non si dispone già di un clone locale del repository in cui si desidera aggiungere il nuovo ramo, ma si desidera creare un nuovo repository locale, allora git clone --branch <branch_name> --single-branch <repo_url>fornisce una soluzione più breve.


1
Grazie, fa quello che ha chiesto l'operazione. Per effettuare il checkout git del ramo di tracciamento -t <ramo remoto> / <nome ramo> <nome ramo>
ken

7
Se lo faccio semplicemente git checkout <branchname>, vedo che git imposta automaticamente il ramo di tracciamento, se l'unico ramo con quel nome è il ramo remoto.
bukzor,

1
questa è stata l'unica cosa che ha funzionato per me. anche se la configurazione è stata impostata per recuperare i ref per un singolo ramo, ha comunque richiamato i ref su tutti i rami usando fetch o pull. questo comando ha tirato solo il ramo che volevo, quindi il repository era solo 500kb e non 5mb. Grazie.
Herostwist,

1
Questa risposta è probabilmente obsoleta. git cloneora supporta --branche --single-branchopzioni, ho pubblicato una risposta con dimostrazione .
user1338062

3
@ user1338062 Questo è ancora valido se si desidera recuperare solo un nuovo ramo (non tutti i rami che usano git fetch) dopo la clonazione
rubyprince,

35

So che ci sono già molte risposte, ma questi sono i passaggi che hanno funzionato per me:

  1. git fetch <remote_name> <branch_name>
  2. git branch <branch_name> FETCH_HEAD
  3. git checkout <branch_name>

Questi si basano sulla risposta di @Abdulsattar Mohammed, sul commento di @Christoph su quella risposta e su queste altre domande di overflow dello stack e sulle loro risposte:


1
La risposta più utile qui IMO
Daniel Holmes,

31

Per aggiornare il telecomando esistente per tenere traccia di rami specifici utilizzare solo:

git remote set-branches <remote-name> <branch-name>

Da git help remote:

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.

1
Incredibile, ero in un --single-branchrepository e non ho potuto scaricare altre filiali in seguito. Grazie!
Yajo,

22

Un modo per farlo:

in .git / config fetch per il repository remoto dovrebbe essere impostato per recuperare qualsiasi ramo:

   [remote "origin"]
            fetch = +refs/heads/*:refs/remotes/origin/*

per recuperare il ramo remoto:

git fetch origin branch-name

per creare un ramo locale 'nome-ramo' impostato per tracciare il ramo remoto 'nome-ramo' dall'origine.

git checkout -b branch-name origin/branch-name

per elencare tutti i rami

git branch -a

16

Copiato dal post dell'autore:

Utilizzare l' -topzione per git remote add, ad esempio:

git remote add -t remote-branch remote-name remote-url

È possibile utilizzare più -t branchopzioni per afferrare più rami.


10
Sottovalutato, perché rispondi con una risposta esistente nella stessa discussione?
Bowen,

13

Se si desidera modificare il valore predefinito per "git pull" e "git fetch" per recuperare solo rami specifici, è possibile modificare .git / config in modo che la configurazione remota sia simile a:

[remote "origin"]
  fetch = +refs/heads/master:refs/remotes/origin/master

Questo recupererà il master dall'origine solo per impostazione predefinita. Vedi per maggiori informazioni: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

EDIT: Ho appena realizzato che è la stessa cosa che fa l'opzione -t per git remote add. Almeno questo è un bel modo per farlo dopo aver aggiunto il telecomando se non vuoi eliminare il telecomando e aggiungerlo di nuovo usando -t.


1
Il link progit.org/book/ch9-5 è stato spostato su git-scm.com/book/en/Git-Internals-The-Refspec
qui il

8

Per completezza, ecco un comando di esempio per un nuovo checkout:

git clone --branch gh-pages --single-branch git://github.com/user/repo

Come menzionato in altre risposte, si imposta remote.origin.fetchcosì:

[remote "origin"]
        url = git://github.com/user/repo
        fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages

5

versione git: 2.74

Ecco come lo faccio:

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]

4

versione git 2.16.1.windows.4

Basta fare un git per recuperare remoteRepositoryName branchName (eg: git fetch origin my_local_branch) è abbastanza. Verrà eseguito il recupero e verrà creato un nuovo ramo locale con lo stesso nome e il monitoraggio verrà impostato su ramo remoto.

Quindi eseguire git checkout branchName


1
il ramo non appare sotto git branchfino al checkout in esso
commonpike

3

Le mie soluzioni alternative:

git fetch --depth=1
git checkout <branch_name>

se non hai un clone locale:

git clone --depth 1 -b <branch_name> <repo_url>

3
  1. Scegli <remote_name>quello che desideri utilizzare (sentiti libero di usare origin e salta il passaggio 1)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. Scegli <your_local_branch_name>quello che desideri utilizzare. Potrebbe essere lo stesso di <branch>.
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

Spero che aiuti!


2

La risposta in realtà dipende dall'elenco corrente dei rami di tracciamento che hai. Puoi recuperare un ramo specifico da remoto git fetch <remote_name> <branch_name> solo se il ramo è già nell'elenco dei rami di tracciamento (puoi verificarlo congit branch -r ).

Supponiamo di aver precedentemente clonato il telecomando con l'opzione --single-branch, e in questo caso l'unico ramo di tracciamento che ho è quello "clonato". Sono un po 'sconcertato dai consigli di modificare manualmente git config, così come digitando i git remote add <remote_name> <remote_url>comandi. Poiché "git remote add" imposta un nuovo telecomando, ovviamente non funziona con il repository remoto esistente; fornire opzioni "-t branch" non mi ha aiutato.

Nel caso in cui il telecomando esista e il ramo che vuoi recuperare esiste in quel telecomando:

  1. Verifica git branch -rse riesci a vedere questo ramo come ramo di monitoraggio. In caso contrario (come nel mio caso con un clone di un singolo ramo), aggiungi questo ramo all'elenco dei rami di tracciamento "git set-rami remoti" con l'opzione --add:

    • git remote set-branches --add <remote_name> <branch_name>
  2. Ora puoi recuperare un ramo specifico (duplica qui altre risposte):

    • git fetch <remote_name> <branch_name>
  3. E crea ed esegui il checkout di un nuovo ramo locale con "checkout --track", a cui verrà assegnato lo stesso "branch_name" di un ramo di monitoraggio:

    • git checkout --track <remote_name>/<branch_name>

0

Il modo più semplice per farlo

  git fetch origin <branch> && git checkout <branch>

Esempio: voglio recuperare il ramo uat dall'origine e passare a questo come ramo funzionante corrente.

   git fetch origin uat && git checkout uat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.