Come si interrompe il monitoraggio di una filiale remota in Git?


557

Come si interrompe il monitoraggio di una filiale remota in Git ?

Sto chiedendo di interrompere il tracciamento perché nel mio caso concreto, voglio eliminare la filiale locale, ma non quella remota. Eliminando quello locale e spingendo la cancellazione su remoto si cancellerà anche il ramo remoto:

Posso solo fare git branch -d the_branch, e non verrà propagato quando più tardi git push?

Si propagherà solo se dovessi correre git push origin :the_branchpiù tardi?

Risposte:


709

Come accennato in Yoshua Wuyts ' risposta , utilizzando git branch:

git branch --unset-upstream

Altre opzioni:

Non è necessario eliminare la filiale locale.

Elimina semplicemente il ramo locale che sta monitorando il ramo remoto:

git branch -d -r origin/<remote branch name>

-r, --remotesdice a git di eliminare il ramo di tracciamento remoto (ovvero eliminare il ramo impostato per tracciare il ramo remoto). Questo sarà non eliminare il ramo sul repo a distanza !

Vedi " Fare fatica a capire git-fetch "

non esiste tale concetto di filiali di localizzazione locali, solo filiali di localizzazione remote.
Quindi origin/masterè un ramo di tracciamento remoto per masternel originrepository

Come accennato in Dobes Vandermeer 's risposta , è inoltre necessario ripristinare la configurazione associato alla locale filiale:

git config --unset branch.<branch>.remote
git config --unset branch.<branch>.merge

Rimuovere le informazioni a monte per <branchname>.
Se non viene specificato alcun ramo, viene impostato automaticamente il ramo corrente.

(git 1.8+, ottobre 2012, commit b84869e di Carlos Martín Nieto ( carlosmn) )

Ciò renderà completamente inconsapevole qualsiasi push / pull origin/<remote branch name>.


8
Il ramo di tracciamento remoto viene ricreato dopo il recupero di git. È possibile escluderli?
Matt R

1
@Matt: credo che ciò avvenga impostando l'impostazione di remote.<name>.fetchconfigurazione refspec, ma non sono sicuro che sia possibile escludere un ramo quando si specifica un refspec.
VonC,

Sembrava così anche a me; Sono stato in grado di reimpostare il mio ramo locale però e dopo l'avanzamento veloce l'apparente connessione tra i rami è scomparsa.
Willoller,

7
@ruffin: questo è del tutto normale: git branch -d -r origin/<remote branch name>eliminerà un ramo di tracciamento remoto come dichiarato localmente , nel tuo repository. Esso non elimina il ramo sul repo telecomando stesso (solo git push :developmentlo farebbe). Quindi, quando stai spingendo il tuo locale development, con una storia diversa dal ramo di sviluppo remoto (sul repository remoto), riceverai comunque l' non-fast-forwardavviso.
VonC,

1
@Marco vero, ma preferisco farlo comunque, lo trovo "più pulito".
VonC

200

Per rimuovere l'upstream per il ramo corrente, procedere come segue:

$ git branch --unset-upstream

Questo è disponibile per Git v.1.8.0 o successivo. (Fonti: 1.7.9 ref , 1.8.0 ref )

fonte


20
Avrebbe dovuto essere la risposta scelta.
Kaiser,

9
Se non vuoi rimuovere il ramo corrente, semplicemente:git branch --unset-upstream [branchname]
Sonata

2
Sembra che questo sia nuovo. Un po 'più di informazioni sarebbe carino. Ad esempio la versione di introduzione.
ManuelSchneid3r

Certo, sentiti libero di rispondere quando lo scoprirai e aggiornerò felicemente il commento
Yoshua Wuyts,

Hmm, sto ottenendo fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. dopo aver fatto questo e aver provato un git pull origin / master
information_interchange

106

Per rimuovere l'associazione tra l'esecuzione della diramazione locale e remota:

git config --unset branch.<local-branch-name>.remote
git config --unset branch.<local-branch-name>.merge

Se lo desideri, elimina successivamente il ramo locale se non ti serve:

git branch -d <branch>

Questo non eliminerà il ramo remoto.


11
git branch -d <branch>non è richiesto per rimuovere l'associazione.
Marco

1
Sto usando JIRA. Quando tiro di nuovo appare il ramo. Come posso impedirlo?
powder366,

1
@ Marco Corretto, ma se lo usi git branch -vvvedrai comunque i vecchi rami fino a quando non lo fai git branch -d <branch>.
SeldomNeedy,

@ powder366 A seconda delle impostazioni, è git pullpossibile acquisire tutti i rami remoti e aggiungere nuovamente quelli che ritiene siano "apparsi" sul telecomando. È possibile modificare questo comportamento di "estrazione di tutti i rami" eseguendo git config [--global] push.default simpleo git config [--global] push.default current. Maggiori informazioni push.defaultqui .
SeldomNeedy,

1
@SeldomNeedy Penso che potresti perdere il punto di un DVCS? Il punto è che posso avere un ramo che inizia a tracciare un ramo a monte, ma che mi distacco per perseguire un approccio che il ramo a monte non sta usando. In quel caso, il ramo non è né "vecchio" (perché ci sto ancora sviluppando) né "in disuso" (perché lo sto usando). Questa è una grande parte del design di un DVCS. Ha senso?
Marco,

33

Il modo più semplice è modificare .git/config

Ecco un file di esempio

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        url = git@example.com:repo-name
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "test1"]
        remote = origin
        merge = refs/heads/test1
[branch "master"]
        remote = origin
        merge = refs/heads/master

Elimina la linea merge = refs/heads/test1nella test1sezione del ramo


3
+1 Non posso dire in modo definitivo che questo è il metodo più semplice, ma certamente si rivela il più facile da capire per me (e si spera quindi da ricordare)!
salvia

Bella soluzione +1. Questo è in realtà il luogo in cui è registrato il tracciamento, facile da modificare, chiaro cosa fa. Anche la linea di comando .git/configè disponibile.
Hakre,

5
a proposito, questo è lo stesso della soluzione "git config --unset" di Dobes Vandermeer. "git config" modifica questo file.
JZ,

10

Puoi eliminare il ramo di tracciamento remoto utilizzando

git branch -d -r origin/<remote branch name>

come menzionato sopra VonC. Tuttavia, se mantieni la tua copia locale del ramo, proverai git push comunque a spingere quel ramo (che potrebbe darti un errore di avanzamento non veloce come ha fatto per ruffin ). Questo perché la configurazione push.defaultpredefinita è matchingche significa:

matching - spinge tutti i rami corrispondenti. Tutti i rami con lo stesso nome su entrambe le estremità sono considerati corrispondenti. Questo è il valore predefinito.

(vedi http://git-scm.com/docs/git-config sotto push.default)

Dato che questo probabilmente non è quello che volevi quando hai eliminato il ramo di tracciamento remoto, puoi impostare push.defaultsu upstream(o trackingse hai git <1.7.4.3)

a monte - spinge il ramo corrente al suo ramo a monte.

utilizzando

git config push.default upstream

e git smetterà di provare a spingere i rami che hai "smesso di tracciare".

Nota: la soluzione più semplice sarebbe quella di rinominare il tuo ramo locale in qualcos'altro. Ciò eliminerebbe anche un certo potenziale di confusione.


3

Ecco una riga per rimuovere tutti i rami di tracciamento remoto corrispondenti a un modello:

git branch -rd $(git branch -a | grep '{pattern}' | cut -d'/' -f2-10 | xargs)


Se solo i rami di tracciamento remoto devono essere non tracciati (eliminati), allora penso che questa sia un'alternativa di una riga più breve:git branch -r -D $(git branch -r | grep -v "master")
dma_k,

1

Questa non è una risposta alla domanda, ma non sono riuscito a capire come ottenere una formattazione del codice decente in un commento sopra ... quindi il mio commento è auto-down-reputazione-essere-dannato.

Ho la ricetta presentata da @Dobes in una voce di fantasia shmancy [alias] nel mio .gitconfig:

# to untrack a local branch when I can't remember 'git config --unset'
cbr = "!f(){ git symbolic-ref -q HEAD 2>/dev/null | sed -e 's|refs/heads/||'; }; f"
bruntrack = "!f(){ br=${1:-`git cbr`};  \
    rm=`git config --get branch.$br.remote`; \
    tr=`git config --get branch.$br.merge`; \
    [ $rm:$tr = : ] && echo \"# untrack: not a tracking branch: $br\" && return 1; \
    git config --unset branch.$br.remote; git config --unset branch.$br.merge; \
    echo \"# untrack: branch $br no longer tracking $rm:$tr\"; return 0; }; f"

Quindi posso solo correre

$ git bruntrack branchname

1
+1. Bello alias, oltre alla mia risposta sopra .
VonC,

-1

git branch --unset-upstream interrompe il monitoraggio di tutte le filiali locali, il che non è auspicabile.

Rimuovere la [branch "branch-name"]sezione dal .git/configfile seguito da

git branch -D 'branch-name' && git branch -D -r 'origin/branch-name'

funziona meglio per me.


-1

È possibile utilizzare questo modo per rimuovere il ramo remoto

git remote remove <your remote branch name>

1
Ciò eliminerebbe tutti i rami di tracciamento remoto per quel telecomando: se ne hai più di uno, ciò potrebbe essere problematico.
VonC

-2

Il modo più semplice per farlo è eliminare il ramo in remoto e quindi usare:

git fetch --prune (alias git fetch -p)


14
Sono confuso, l'OP non ha voluto eliminare il ramo remoto.
madth3,

È utile pulire i rami remoti monitorati dal repository locale che è stato eliminato sul repository bare remoto.
Marek Podyma,
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.