Come si rimuove un riferimento di ramo remoto non valido da Git?


731

Nel mio attuale repository ho il seguente output:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Voglio eliminare remotes/public/masterdall'elenco delle filiali:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Inoltre, l'output di git remoteè strano, poiché non elenca public:

$ git remote show 
origin

Come posso eliminare "telecomandi / pubblico / master" dalla lista delle filiali?

Aggiornamento, ho provato il git pushcomando:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
Ha funzionato git remote prune [remote-name]o git fetch -p [remote-name]meno nel tuo scenario? Farlo con git gcè molto più forte di quanto sia normalmente necessario.
rjmunro,

6
git remote prune [remote-name]non funzionerà con git svn, anche se nemmeno git gc... git branch -rd origin/namefunziona. @Casey, probabilmente dovresti selezionare la seconda risposta, è leggermente meno pericolosa.
naught101

4
Adoro questa domanda. Tornando quasi ogni mese
Oluckyman,

Correlato, se non un target dupe: Elimina un ramo Git sia localmente che da remoto .

2
Per evitare errori gitter n00b in futuro, ti consiglio di utilizzare un ramo di esempio diverso rispetto a master... in particolare durante l'eliminazione sul telecomando.
absynce,

Risposte:


743

Potresti aver bisogno di una pulizia:

git gc --prune=now

o potresti aver bisogno di una prugna:

git remote prune public

fesso

Elimina tutti i rami di tracciamento non aggiornati in <nome>. Questi rami non aggiornati sono già stati rimossi dal repository remoto a cui fa riferimento <name>, ma sono ancora disponibili localmente in "telecomandi / <name>".

Con l'opzione --dry-run, segnala quali rami verranno potati, ma non potarli effettivamente.

Tuttavia, sembra che questi avrebbero dovuto essere ripuliti in precedenza con

git remote rm public 

rm

Rimuovere il telecomando <name>. Tutti i rami di tracciamento remoti e le impostazioni di configurazione per il telecomando vengono rimossi.

Quindi potresti aver modificato manualmente il tuo file di configurazione e questo non si è verificato, oppure hai problemi con i privilegi.

Magari eseguilo di nuovo e vedi cosa succede.


Contesto di consulenza

Se dai un'occhiata nei registri delle revisioni , noterai che ho suggerito tecniche più "corrette", che per qualsiasi motivo non volessero lavorare sul loro repository.

Sospettavo che l'OP avesse fatto qualcosa che lasciasse il suo albero in uno stato incoerente che lo faceva comportare in modo un po 'strano, e gli git gcera stato richiesto di sistemare la sinistra dietro l'innesto.

Di solito git branch -rd origin/badbranch è sufficiente per bombardare un ramo di monitoraggio locale o git push origin :badbranchper bombardare una filiale remota, e di solito si mai bisogno di chiamaregit gc


4
Non voglio cancellare il ramo sul lato remoto. Penso che ci sia una sottile differenza.
cmcginty,

2
ehm, la domanda si sta effettivamente ponendo "come posso eliminare un ramo remoto". Ecco quali sono questi percorsi.
Kent Fredric,

1
Riformulerò l'argomento se questo rende più chiaro ciò che sto chiedendo, ma il comando mostra esattamente qual è il mio problema.
cmcginty,

40
git gcnon è necessario qui, ma git remote prunemi fa sentire più sicuro dell'eliminazione manuale delle cose git branch -rd, poiché git sta verificando quali rami remoti vengono eseguiti.
Mike Seplowitz,

3
questo non ha funzionato per me - il 'git branch -rd' ha funzionato bene, comunque.
dsummersl,

683

Tutto quello che devi fare è

git fetch -p

Rimuoverà tutte le filiali locali che vengono eliminate da remoto.

Se utilizzi git 1.8.5+, puoi impostarlo automaticamente

git config fetch.prune true

o

git config --global fetch.prune true

7
Questo è quello che stavo anche cercando: la domanda sta descrivendo uno scenario più complicato di quello comune.
rjmunro,

22
Sto cercando un modo per eliminare le filiali locali in cui è stato eliminato il telecomando corrispondente, ma questo non funziona per me. Qualche idea sul perché?
jackocnr

11
Ciò rimuove i rami elencati in remoto / origine ma non elimina i rami di tracciamento locali, il che è altrettanto importante.
BlueRaja - Danny Pflughoeft il

@Cupcake Dato che non hai eseguito il rollback della mia prima modifica (che correggeva le informazioni errate su Git 1.8.5+), ora lo hai reso errato. La mia seconda modifica stava risolvendo ciò che avevo inserito che non era corretto, che ora è di nuovo lì (con il tuo rollback). Vai avanti e torna indietro di un'altra modifica per avere l'originale. Grazie.
ferventcoder,

@ferventcoder Ho ricontrollato l'ultima modifica e ho eseguito il rollback. L'OP può tornare di nuovo se non gli piace. Grazie.

319
git push public :master

Ciò eliminerebbe il ramo remoto chiamato mastercome ha sottolineato Kent Fredric.

Per elencare i rami di tracciamento remoto:

git branch -r

Per eliminare un ramo di tracciamento remoto:

git branch -rd public/master

6
Questo mi ha aiutato a rimuovere un ramo fantasma remoto git-svn.
Nick,

9
git branch -rd removed_remote/branchha funzionato per me, mentre git gc --prune=nowera inutile.
rchampourlier,

2
Sono stato in grado di utilizzare git prunesenza problemi, ma il mio collega che ha modificato il nostro repository principale ** POTREBBE SOLO ** utilizzare la git branch -rd public/mastersoluzione in stile per ripulire il suo ambiente.
Abel,

3
git branch -rd public/masterera quello che mi mancava. Avevo heroku/mastere herkou/master... lol woops
Aaron il

@rchampourlier Non inutile al 100%: se il tuo repository git è grande, rimuovere i rami inutilizzati può liberare molto spazio su disco in alcune situazioni.
Peter - Ripristina Monica il

159

Tutto quello che devi fare è

$ git branch -rd origin/whatever 

È così semplice. Non c'è motivo di chiamare un gc qui.


1
come si "spinge" quell'eliminazione su github?
Giovedì

14
@Thufir Non è questa la questione. Questa domanda era specifica per le situazioni in cui si ha un riferimento remoto non valido nel repository locale, ma quel ramo non esiste più sul server remoto. La risposta alla tua domanda è $ git push origin: qualunque cosa
jpswain,

Sì, se succede qualcosa sul repository remoto in cui un ramo viene eliminato, ma hai ancora riferimento a quel ramo remoto sul tuo computer locale, allora dovrai fare ciò che ho inserito nella mia risposta originale per ripulirlo.
jpswain,

6
Se hai un grande lavoro di pulizia (molti telecomandi penzolanti), puoi semplicemente eliminare tutti i rami remoti con qualcosa come git branch -rd $(git branch -r)poi ristabilire quelli validi facendo un recupero.
nobar,

La mia situazione era che avevo usato git config -eper rinominare il mio telecomando. Ho rinominato il telecomando minein origin. Quindi, questa è stata la soluzione che ha funzionato meglio per me:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu

70

git gc --prune=now non è quello che vuoi.

git remote prune public

o git remote prune origin# se è l'origine remota

è quello che vuoi


6
@Casey $ git gc # preferisce la deframmentazione dei file git per velocizzare il repository $ git remote prune origin # pulirà l'eliminazione dei rami remoti stantii che appaiono con "git branch -r | grep origin". Questo è quello che la domanda sta facendo credo. Quindi, i comandi sono totalmente diversi.
tongueroo,

29

La risposta accettata non ha funzionato per me quando l'arbitro era pieno. Questo tuttavia:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

Ha funzionato per me. Il ramo git regolare -d non funzionava, restituiva l'errore che il ramo non esisteva, perché ho rimosso l'origine chiamata "originale", creata per errore, direttamente nel file .git / config.
micrub,

Questo è il metodo che ho dovuto usare per rimuovere i rami che sono stati inavvertitamente omessi dal mio .git / config (che è stato ricostruito a causa di una corruzione non correlata). Peccato che questa risposta fosse così lontana che non me ne sono accorta fino a quando finalmente ho trovato la soluzione e sono andata ad aggiungerla alla risposta accettata!
Taranaki,

Questo è ciò di cui avevo bisogno dopo aver usato svn2git. C'erano molti rami telecomandi / svn / *. Prima dovevo creare un falso telecomando "svn".
Sam

7

Nel mio caso stavo cercando di eliminare le voci salvate in .git/packed-refs. È possibile modificare questo file di testo semplice ed eliminare le voci da essogit br -D non sanno come toccare (almeno nella versione 1.7.9.5).

Ho trovato questa soluzione qui: https://stackoverflow.com/a/11050880/1695680


wow, questo mi ha aiutato. Il mio collega ha provato, riavvia VS, riavvia il suo computer, non ha funzionato, ha eliminato il suo repository locale e ha fatto tutto per sbarazzarsene :)
Esen,

1
Oggi mi sono reso conto che questo file pack-refs è stato creato come parte di git gc, quando racchiude i tuoi commit in un archivio altamente compresso, ha anche spostato i riferimenti in un singolo file di testo semplice, probabilmente per scopi di ottimizzazione; Spero che le versioni future di git possano git br -D ...contenere refs.
ThorSummoner,


3

Non lo sapevo git branch -rd, quindi il modo in cui ho risolto problemi come questo per me è quello di trattare il mio repository come un repository remoto ed eseguire un'eliminazione remota. git push . :refs/remotes/public/master. Se gli altri modi non funzionano e hai qualche strano riferimento di cui vuoi sbarazzarti, questo modo crudo è sicuro. Ti dà la precisione esatta per rimuovere (o creare!) Qualsiasi tipo di riferimento.


2

Solo leggermente correlato, ma potrebbe comunque essere utile nella stessa situazione che abbiamo avuto - usiamo una condivisione di file di rete per il nostro repository remoto. La settimana scorsa le cose funzionavano, questa settimana abbiamo ricevuto l'errore "L'origine remota non ha pubblicizzato Ref per i riferimenti di filiale / head / master. Questo riferimento potrebbe non esistere nel telecomando o potrebbe essere nascosto dalle impostazioni di autorizzazione"

Ma credevamo che non fosse stato fatto nulla per corrompere le cose. L'NFS fa delle istantanee, quindi ho rivisto ogni "versione precedente" e ho visto che tre giorni fa, la dimensione in MB del repository era passata da 282 MB a 33 MB, e ora esistevano circa 1.403 nuovi file e 300 cartelle. Ho interrogato i miei colleghi e uno aveva provato a fare una spinta quel giorno - poi l'ho cancellato.

Ho usato la funzionalità "Ripristina" di NFS per ripristinarla a poco prima di quella data e ora tutto funziona di nuovo bene. Ho provato la prugna in precedenza, non sembrava aiutare. Forse le pulizie più dure avrebbero funzionato.

Spero che questo possa aiutare qualcun altro un giorno!

ghiandaia


2

Ho avuto un problema simile. Nessuna delle risposte ha aiutato. Nel mio caso, ho rimosso due repository remoti in modo permanente.

La mia ultima idea era quella di rimuovere tutti i riferimenti ad esso a mano.

Diciamo che il repository si chiama "Repo". L'ho fatto:

find .git -name Repo 

Quindi, ho eliminato i file e le directory corrispondenti dalla cartella .git ( questa cartella può essere trovata nella tua app Rails o sul tuo computer https://stackoverflow.com/a/19538763/6638513 ).

Quindi ho fatto:

grep Repo -r .git

Questo ha trovato alcuni file di testo in cui ho rimosso le righe corrispondenti. Ora, tutto sembra andare bene.

Di solito, dovresti lasciare questo lavoro a git.

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.