2010-02-20 11 views
8

Desidero tenere traccia di un ramo master remoto da un nuovo repository remoto. Entrambi esistono già.Ramo di monitoraggio remoto installazione Git

Come faccio a fare questo in git? Non riesco a farlo bene. Ho provato:

git remote add otherRepo git://... 
git branch -t myTrack otherRepo/master 

Tuttavia, ottengo il seguente errore:

fatal: Not a valid object name: 'otherRepo/master'.

+3

Hai fatto 'git fetch fetch otherRepo' prima di provare a diramarti? 'git remote add' semplicemente configura il telecomando, non esegue automaticamente il recupero. Se lo hai già scaricato, sei sicuro che abbia un ramo chiamato master? 'git branch -r' o' git remote show -n otherRepo' (* dopo averlo scaricato *) per verificare quali rami ha. –

+0

@crhis: grazie, ora funziona. Sembra logico che devo recuperare, comunque questo aggiunge, anche tutti gli altri rami di otherRepo. Posso semplicemente recuperare altroRepo/Master? Non voglio ingombrare il ramo -r. –

risposta

12

Come indicato nei commenti: git remote add otherRepo … configura solo il telecomando, non recupera nulla da esso. È necessario eseguire git fetch otherRepo per recuperare i rami del repository remoto prima di poter creare filiali locali basate su di essi.


(rispondendo ad un ulteriore commento di OP)

Se si desidera solo per tenere traccia di un singolo ramo dal repository remoto, è possibile riconfigurare la vostra proprietà a distanza di fetch (remote.otherRepo.fetch).

# done as a shell function to avoid repeating the repository and branch names 
configure-single-branch-fetch() { 
    git config remote."$1".fetch +refs/heads/"$2":refs/remotes/"${1}/${2}" 
} 
configure-single-branch-fetch "$remoteName" "$branch" 
# i.e. # configure-single-branch-fetch otherRepo master 

Dopo questo, git fetch otherRepo sarà solo prendere master ramo del repository remoto nel ‘ramo di monitoraggio remoto’ otherRepo/master nel repository locale.

Per la pulizia degli altri 'rami di monitoraggio a distanza', si potrebbe eliminare tutti loro e ri-prendere solo quello che si desidera, o si potrebbe eliminare selettivamente tutti loro, tranne proprio quello che si desidera:

git for-each-ref --shell --format='git branch -dr %(refname:short)' refs/remotes/otherRepo | sh -nv 
# remove the -nv if the commands look OK, then 
git fetch otherRepo 

# OR 

git for-each-ref --shell --format='test %(refname:short) != otherRepo/master && git branch -dr %(refname:short)' refs/remotes/otherRepo | sh -nv 
# remove the -nv if the commands look OK 

Se si decide di monitorare più di un ramo remoto, ma non tutti, è possibile avere più configurazioni di recupero (con git config --add remote."$remoteName".fetch … o utilizzando git config --edit per duplicare e modificare direttamente la riga nel file di configurazione del repository).

Se si desidera anche evitare di recuperare i tag dal telecomando, configurare la proprietà tagopt del telecomando (remote.otherRepo.tagopt).

git config remote."$remoteName".tagopt --no-tags 
# i.e. # git config remote.otherRepo.tagopt --no-tags 
+0

grazie per questa risposta molto completa. Sembra terribile che un'operazione così facile sia resa così complessa. Qualunque cosa –

4

Si potrebbe provare

git checkout -b myTrack otherRepo/master 

Questo creerà una nuova MyTrack ramo, che segue il ramo/master otherRepo.

+0

Non funziona, l'errore è: fatale: git checkout: i percorsi di aggiornamento non sono compatibili con i rami di commutazione. Hai intenzione di eseguire il checkout di 'otherRepo/master' che non può essere risolto come commit? ' –

+0

Ha funzionato per me dopo aver effettuato l'aggiunta remota e il recupero. – Von

Problemi correlati