git remote prune - non ha mostrato tanti rami potati come mi aspettavo


113

Dalla pagina man:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Quindi ho rimosso un mucchio di rami usando

git push origin :staleStuff

e poi corse

git remote prune origin

Tuttavia, solo una singola filiale locale è stata potata. Alcuni di questi rami sono stati creati da me, altri da colleghi. Questo indica che non stavo monitorando correttamente quei rami in primo luogo?


7
per scoprire quali rami verranno rimossi puoi fare git remote show origine cercare tutti i rami contrassegnatistale
Someone Somewhere,

Risposte:


189

Quando lo usi git push origin :staleStuff, si rimuove automaticamente origin/staleStuff, quindi quando corri git remote prune origin, hai potato qualche ramo che è stato rimosso da qualcun altro. È più probabile che i tuoi colleghi ora debbano correre git pruneper sbarazzarsi dei rami che hai rimosso.


Allora cosa git remote prunefa esattamente ? Idea principale: i rami locali (non quelli di tracciamento) non vengono toccati dal git remote prunecomando e devono essere rimossi manualmente.

Ora, un esempio del mondo reale per una migliore comprensione:

Hai un repository remoto con 2 rami: mastere feature. Supponiamo che tu stia lavorando su entrambi i rami, quindi di conseguenza hai questi riferimenti nel tuo repository locale (i nomi di riferimento completi vengono forniti per evitare qualsiasi confusione):

  • refs/heads/master(nome breve master)
  • refs/heads/feature(nome breve feature)
  • refs/remotes/origin/master(nome breve origin/master)
  • refs/remotes/origin/feature(nome breve origin/feature)

Ora, uno scenario tipico:

  1. Un altro sviluppatore termina tutto il lavoro sul feature, lo unisce mastere rimuove il featureramo dal repository remoto.
  2. Per impostazione predefinita, quando fai git fetch(o git pull), nessun riferimento viene rimosso dal tuo repository locale, quindi hai ancora tutti quei 4 riferimenti.
  3. Decidi di ripulirli e corri git remote prune origin.
  4. git rileva che il featureramo non esiste più, quindi refs/remotes/origin/featureè un ramo obsoleto che dovrebbe essere rimosso.
  5. Ora hai 3 riferimenti, incluso refs/heads/feature, perché git remote prunenon rimuove alcun refs/heads/*riferimento.

È possibile identificare i rami locali, associati ai rami di tracciamento remoto, tramite branch.<branch_name>.mergeparametro di configurazione. Questo parametro non è realmente necessario per far funzionare qualcosa (probabilmente tranne git pull), quindi potrebbe mancare.

(aggiornato con esempi e informazioni utili dai commenti)


Ho capito la situazione: i rami sono ancora presenti localmente ma rimossi dal repository remoto. Ora voglio rimuovere tutti i rami locali che non esistono sul telecomando, quindi eseguo git prune. Questo è ciò che mi dice "Questi rami obsoleti sono già stati rimossi dal repository remoto". Ho sbagliato?
Felixyz

3
Hai ragione, ma potresti aver frainteso il significato di "filiali locali" in caso di git prune. Solo le ramificazioni /refs/remotes/<remote_name>/sono soggette a potatura; eventuali rami in /refs/heads/non verranno toccati: devi gestirli manualmente.
massimo

Aha, è proprio quello che pensavo. Quindi non c'è modo di fare quello che voglio: eliminare automaticamente tutti i rami nelle teste che stanno monitorando i rami remoti, controllando se quei rami remoti vengono eliminati?
Felixyz

2
Non esiste un comando integrato per questo, ma puoi scrivere tu stesso tale script. I rami di tracciamento possono essere identificati dalla presenza del branch.<branch_name>.mergeparametro di configurazione.
massimo

Questa risposta sarebbe migliore se aggiungessi le informazioni nei commenti alla risposta stessa in modo che tutti coloro che vengono qui e hanno lo stesso malinteso di @Felixyz non debbano guardare la tua risposta in modo divertente e poi leggere i commenti per ottenere finalmente la comprensione .
Akrikos
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.