2013-03-19 15 views
23

Non voglio recuperare ogni ramo dall'origine perché ce ne sono molti. Voglio solo tenere traccia di alcuni (ad es., master) e le mie filiali (organizzate nella sottodirectory my_name). Posso fare quanto segue:Posso specificare in .git/config per recuperare più refspec?

$ git fetch origin refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch 

voglio specificare il sopra "set" di refspecs come predefinito di git fetch. Ho provato

$ git config remote.origin.fetch refs/heads/my_name/*:refs/remotes/origin/my_name/* 
$ git config --add remote.origin.fetch refs/heads/master:refs/remotes/origin/master 

Fallisce:

$ git config remote.origin.fetch 
refs/heads/my_name/*:refs/remotes/origin/my_name/* 
error: More than one value for the key remote.origin.fetch: refs/heads/master:refs/remotes/origin/master 

ho anche provare quanto segue ma non riesce anche:

$ git config remote.origin.fetch 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch' 
$ git fetch 
fatal: Invalid refspec 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch' 

Nota: Git 1.7.11

+1

Nota: da Git 2.1 (agosto 2014), è possibile eseguire l'override del refspec di recupero per ogni invocazione (ovvero solo per un comando), con la nuova opzione di recupero '--refmap = ': vedere [la mia risposta sotto] (http://stackoverflow.com/a/25098004/6309) – VonC

risposta

26

È possibile aggiungere le seguenti righe nel tuo .git/config per specificare più punti focali per il recupero:

[remote "origin"] 
     fetch = refs/heads/my_name/*:refs/remotes/origin/my_name/* 
     fetch = refs/heads/master:refs/remotes/origin/master 
     fetch = refs/heads/some_branch:refs/remotes/origin/some_branch 

È possibile aggiungere il prefisso + prima della refspec, se si desidera sovrascrivere il recupero riferimenti non-fast-forward e, in questo modo:

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

noti che globbing parziale non è supportato (vale a dire a/b/ca* non è supportato, ma è a/b/*).

10.5 Git Internals - The Refspec

+1

Mi rendo conto che l'errore riportato da "git config remote.origin.fetch" non significa che non potrebbe funzionare con più valori. Devo solo interrogarlo in modo diverso usando "git config --get-all remote.origin.fetch" – user716468

+2

@Tuxdude Grazie per quello. C'è un unico comando che potrebbe raggiungere quanto sopra? Sto cercando di mantenere la documentazione concisa per i nuovi sviluppatori, preferirei che potessero specificare più refspec tramite "git config remote.origin.fetch" piuttosto che modificare il proprio file di configurazione git. – danjah

+0

@Danjah qualcosa come "+ refs/heads/master: refs/remotes/origin/master" "funzionerebbe – jmnas

4

Nota: se si desidera prelevare da una refspec diversa su un'unica invocazione (annullando momentaneamente l'operazione di recupero refspec registrati nella configurazione), è possibile farlo dal Git 2.1 (agosto 2014).

Vedi commit c5558f8 da Junio C Hamano (gitster):

Dopo l'introduzione di aggiornamenti opportunistiche di filiali remote-monitoraggio, iniziato intorno alle f269048 (fetch: opportunisticamente aggiornamento di inseguimento arbitri, 2013/05/11) con alcuni aggiornamenti in v1.8.4 era, la configurazione di remote.*.fetch inizia anche quando un refspec per specificare cosa recuperare viene fornito sulla riga di comando e non c'è modo di disabilitarlo o sovrascriverlo per invocazione.

Indicare al comando di prestare attenzione alle opzioni della riga di comando --refmap=<lhs>:<rhs> che è possibile utilizzare per sovrascrivere l'utilizzo di remote.*.fetch configurato come refmap.

Che ti dà la nuova opzione:

--refmap=<refspec> 

Quando il recupero arbitri elencati nella riga di comando, utilizzare il refspec specificato (si può dare più di una volta) per mappare gli arbitri per Remote- rami di tracciamento, anziché i valori delle variabili di configurazione remote.*.fetch per il repository remoto.
Vedere la sezione "Configurazione dei rami di localizzazione remota" per i dettagli.

(che Git "configurato Remote-tracking Branches" sezione risale anche da Git 2.1: vedi "Having a hard time understanding git fetch")

4

Per sovrascrivere quello esistente prendere refspec (s), senza la necessità di modificare manualmente .git/config, è possibile utilizzare --unset-all seguito da altrettante --add secondo necessità.

per l'esempio refspecs desiderate nella questione, sarebbe:

$ git config --unset-all remote.origin.fetch 
    $ git config --add remote.origin.fetch +refs/heads/my_name/*:refs/remotes/origin/my_name/* 
    $ git config --add remote.origin.fetch +refs/heads/master:refs/remotes/origin/master 

Quindi utilizzare git config --get-all remote.origin.fetch per verificare il risultato.

+0

Esattamente quello di cui avevo bisogno! In sostanza, quando il tag della versione viene aggiornato, questo impedisce al vecchio tag di essere nel modo e agli aggiornamenti (e alle cache) senza alcuna penalità per il nuovo tag. Puoi persino tornare al vecchio tag senza problemi. – taranaki

Problemi correlati