2009-09-08 13 views
18

Quando cerco di creare un nuovo ramo monitoraggio di un ramo a distanza, ottengo questo:Perché git branch -t fallisce con "Non tracciare: informazioni ambigue"?

$ git branch -t test origin/foo 
error: Not tracking: ambiguous information for ref refs/remotes/origin/foo 

The source sembra per cercare in qualche modo di rami di monitorare e mi butta fuori perché trova meno più di uno, ma Non capisco esattamente cosa stia cercando dato che gli ho già detto cosa tenere traccia sulla linea di comando.

Qualcuno può dirmi cosa sta succedendo e come risolverlo?

+0

Aggiunti solo alcuni termini e alcuni suggerimenti (solo per esplorare, niente di definitivo) per spiegare la situazione attuale. – VonC

+0

Grazie per il feedback, ma hai effettivamente trovato il motivo dietro il tuo messaggio di errore? – VonC

risposta

10

Trovato! Il problema era che in precedenza avevo installato un telecomando con --mirror, allo scopo di avere una copia di backup/pubblica del mio repository.

Se si esegue

git remote add --mirror <name> <url> 

non unica bandiera il telecomando come specchio (che è quello che volevo per spinte), ma configura anche remote.<mirror>.fetch opzione per lo specchio a +refs/*:refs/*, il che significa che tutti i tuoi i rami improvvisamente "tracciano" il tuo repository mirror e qualsiasi tentativo di creare un ramo di monitoraggio fallirà.

(Come bonus aggiuntivo, l'esecuzione git fetch <mirror> sta per sovrascrivere tutti i vostri arbitri con quelli vecchi dal repo di backup.)

La soluzione che sembra risolvere questo problema sta mettendo remote.<mirror>.fetch-: (che, spero , significa "non recuperare mai nulla"). Questo a quanto pare risolve il problema di tracciamento ed elimina il recupero mortale.

+0

Ho avuto esattamente questo problema e questa soluzione l'ha risolto. Grazie. – offby1

14

perché trova meno di un

No: perché trova più di un corrispondente ramo remoto, il che significa che la funzione remote_find_tracking() restituisce ramo più di un monitoraggio per un determinato ref ramo locale.

È some_remote_branch non già rintracciato da una delle filiali locali?
(a git config -l consentirebbe di controllare ciò che si è attualmente impostato).
(un git branch -r può anche aiutare a elencare i vostri attuali filiali remote-tracking.)


filiali remote, che ho pensato sono qualcosa di diverso che filiali remote-tracking.

errato, come illustrati da this thread:

-remoti rami sono le remote-tracking-rami "reale". Non li impegni a livello locale, sono essenzialmente copie di sola lettura di esattamente ciò che accade in un repository remoto.
Se si prova a 'git-checkout' un ramo di localizzazione remota, si otterrà un HEAD distaccato.

filiale locale:
Un ramo al quale è possibile eseguire il commit delle modifiche. Facoltativamente, il ramo può essere configurato per "seguire" uno dei rami di tracciamento remoto. Ciò significa che un 'git-pull' senza argomenti (quando il tuo ramo locale è estratto), automaticamente 'git-fetch' e quindi 'git-merge' il ramo di localizzazione remota.

Ora:

è il lavoro di git-fetch per aggiornare in remoto il monitoraggio rami con tutte le modifiche presenti nel repository remoto.
Git-pull esegue git-fetch e quindi esegue un git-merge per aggiornare il ramo attualmente estratto.

Il problema è, per git-merge:

Quando questo accade, git-merge deve decidere quali remote-tracking-branch unire nel ramo locale attualmente controllato.
È possibile impostare quale remote-tracking-branch sarà selezionato in questa situazione con l'opzione --track.

--track istituisce un ramo locale di seguito per fare riferimento a ramo di un telecomando, non al ramo di monitoraggio

Consider thatremote_find_tracking() prende un unico telecomando e un refspec con src pieno, e restituisce la data refspec dopo riempiendo il suo dst, se è stato configurato un monitoraggio appropriato per il telecomando, ovvero git.

/* 
* For the given remote, reads the refspec's src and sets the other fields. 
*/ 
int remote_find_tracking(struct remote *remote, struct refspec *refspec); 

Può essere che si consideri già un ramo successivo locale corrispondente a some_remote_branch. Avete qualche filiale locale con lo stesso identico nome?
Oppure il tuo ramo corrente ha un ramo remoto con un nome simile, che lo rende un candidato naturale per qualsiasi git-merge: cercando di farlo rintracciare un altro ramo remoto renderebbe il non in grado di scegliere quale locale ramo per aggiornare/unire con le modifiche di un telecomando.

+0

Sono riuscito a scrivere esattamente il contrario di "more", grazie per averlo indicato :-) In ogni caso, mi sembra di ottenere il messaggio anche se provo a impostare il ramo locale da un ramo remoto che ho appena ricevuto da git -fetch. git config -l non contiene nulla di familiare per il ramo remoto, e git branch -r elenca solo i rami remoti, che pensavo fossero qualcosa di diverso da quelli remoti. O sto confondendo roba? – che

+1

Grazie per la risposta dettagliata, mentre sto leggendo credo che il problema principale era che non sapevo cosa stavo facendo. – che

+0

Grazie per la risposta dettagliata. Mi ha aiutato a capire che il mio problema era causato dall'avere 2 telecomandi con lo stesso schema di recupero. – dregad

18

L'ho visto anche quando avevo due repo remoti con lo stesso schema (predefinito) di recupero (fetch = +refs/heads/*:refs/remotes/origin/*) e gli stessi rami.

non ho ancora trovato il modo di risolvere in modo corretto, perché voglio continuare a spingere/tirare per entrambi i pronti contro termine di, ma aggiungendo manualmente le informazioni per .git/config opere del progetto, esempio:

[branch "mybranch"] 
    remote = origin 
    merge = refs/heads/mybranch 
+7

Immagino che la soluzione sarebbe avere diversi telecomandi che vanno in diversi posti, ad es. invece di avere 'fetch = + refs/heads/*: refs/remotes/origin/*', prova a rinominare la seconda destinazione in qualcosa come 'fetch = + refs/heads/*: refs/remotes/another_repo/*' . – che

+0

Un ottimo punto: il riferimento all'origine nel secondo repository non sembra corretto. Ho davvero bisogno di andare via e comprendere appieno cosa significano le righe "fetch", quindi posso configurare correttamente il secondo repo (che è essenzialmente uno specchio). –

+3

Il significato di 'refs/heads/*: refs/remotes/origin/*' è: prendi tutto il riferimento remoto in 'refs/heads' sul lato remoto, e metti a' refs/heads/origin' sul nostro lato. 'refs/heads' è il percorso in cui sono memorizzati i rami, quindi se si ha il ramo' pippo' sul telecomando, esso verrà scaricato in 'origine/pippo' nel repository locale. Il '+' all'inizio significa che i rami di destinazione dovrebbero essere sempre sovrascritti (senza che ci siano alcuni controlli aggiuntivi). – che

2

Sono entrato in una situazione come questa, ma non so come. L'elenco da git branch -av mi ha mostrato solo un singolo ramo di monitoraggio remoto per il ramo a cui tenevo (origin/dev).

Quello che ho fatto per risolvere il problema è stato quello di utilizzare l'esadecimale commettere hash invece di origin/dev:

git checkout -b dev abc123 
git push -u origin dev 

Quando ho fatto la spinta con -u Git ha detto Branch dev set up to track remote branch dev from origin. tira successivi e spinge lavorato come mi aspettavo.