2016-06-06 10 views
15

A un certo punto ho pensato che git fetch origin --prune rami locali eliminati non erano più presenti sul server. In qualche modo questa non è la mia esperienza al momento.origine di recupero git - la prona non elimina i rami locali?

Ho eseguito questo comando e il ramo locale non è stato eliminato. È non attualmente estratto. Mi sono imbattuto git branch -vv di verificare queste informazioni, e vedo

feature/MyGreatFeature   f30efc7 [origin/feature/MyGreatFeature: gone] 

così sembra di sapere che è andato. Perché non dovrebbe cancellare la mia filiale locale?

Esecuzione git version 2.7.4 (Apple Git-66)

risposta

14

Le varie opzioni di prugna (git remote update --prune, git remote prune, git fetch --prune) solo cancellare a distanza di tracciamento rami.

È necessario eliminare manualmente i rami locali che non si desidera più, oppure modificare o rimuovere le impostazioni di upstream se il ramo di monitoraggio remoto non esiste più. Si noti che ogni ramo locale può registrare un telecomando e/o un ramo che non esiste o non ha mai esistito. In questo caso Git agisce principalmente come se le succursali locali non avessero set upstream, tranne che dalla versione 1.8.5, diversi comandi riportano l'upstream come "andato" o altrimenti non valido, e può suggerire di usare --unset-upstream.


Più precisamente, essi eliminare arbitri di destinazione dopo aver fatto la mappatura refspec dalla riga di comando o fetch linee dalla configurazione. Quindi, per i mirror di recupero, essi possono eliminare i rami locali. La maggior parte dei cloni non sono impostati come specchi di recupero, però.

Ci sono state alcune correzioni di bug recenti per mappature complesse, per assicurarsi che Git non abbia potato un ramo mappato in alcuni casi quando non dovrebbe. Per qualsiasi repository normale - clone ordinario o puro specchio di recupero - queste correzioni non hanno alcun effetto; sono importanti solo se hai complicato le configurazioni fetch.

+0

se c'è un ramo elencato in '[]' su 'git branch -vv' non è un ramo di localizzazione remota in quel caso? – yano

+0

Non necessariamente: la cosa in '[...]' è semplicemente l'upstream. Se l'upstream è un ramo di monitoraggio remoto, è in quel momento che è probabile che venga eliminato. Nel tuo esempio, hai '[origine/funzionalità/MyGreatFeature: gone]' che assomiglia a un ramo di tracciamento remoto che è già stato potato. Git ha ancora il 'ramo locale' feature/MyGreatFeature', e in '.git/config', quel ramo ha ancora il suo remoto impostato su 'origin' e il suo set upstream. Puoi, ad esempio, eliminare il ramo locale (che elimina le informazioni di tracciamento) o '--unset-upstream 'su di esso se vuoi mantenere il ramo locale senza set upstream. – torek

+0

questo è sfortunato, ma sembra essere una risposta accurata – yano

5

Il comando che si desidera è

$ git remote prune origin 

This question è quasi parola per parola quello che stai cercando.

+0

Per più git branching/merging madness, [controllare questa domanda out] (http://stackoverflow.com/questions/13064613/how-to-prune-local-tracking-branches-that-do-non-exist- on-remote-più). –

+2

che non funziona per qualche motivo – yano

+0

Quando dici "non funziona", cosa intendi? Sta fallendo con un errore? Il comando ha successo ma non ha l'effetto desiderato? –