Jak przestać śledzić zdalną gałąź w Git?

556

Jak przestać śledzić zdalną gałąź w Git ?

Proszę o zaprzestanie śledzenia, ponieważ w moim konkretnym przypadku chcę usunąć oddział lokalny, ale nie zdalny. Usunięcie lokalnego i przekazanie usunięcia do zdalnego spowoduje również usunięcie gałęzi zdalnej:

Czy mogę po prostu to zrobić git branch -d the_branchi nie będzie się to rozprzestrzeniać, gdy później git push?

Czy rozprzestrzeni się tylko wtedy, gdybym miał git push origin :the_branchpóźniej uruchomić ?

Jason Cohen
źródło

Odpowiedzi:

708

Jak wspomniano w Yoshua WUYTS ' odpowiedź , używając git branch:

git branch --unset-upstream

Inne opcje:

Nie musisz usuwać swojego lokalnego oddziału.

Wystarczy usunąć oddział lokalny, który śledzi oddział zdalny:

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

-r, --remoteskaże gitowi usunąć gałąź zdalnego śledzenia (tj. usunąć zestaw gałąź, aby śledzić gałąź zdalną). To będzie nie usunąć gałąź na pilocie zdalnego repo !

Zobacz „ Trudności ze zrozumieniem git-fetch

nie ma takiej koncepcji lokalnych gałęzi śledzenia, tylko zdalne gałęzie śledzenia.
Podobnie origin/masterjak gałąź zdalnego śledzenia masterw originrepozytorium

Jak wspomniano w Dobes Vandermeer „s odpowiedź , trzeba również, aby wyzerować konfigurację związaną z lokalnego oddziału:

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

Usuń informacje wstępne dla <branchname>.
Jeśli nie określono żadnej gałęzi, domyślnie jest to bieżąca gałąź.

(git 1.8+, październik 2012 r., commit b84869e autor: Carlos Martín Nieto ( carlosmn) )

To sprawi, że każde naciśnięcie / pociągnięcie będzie całkowicie nieświadome origin/<remote branch name>.

VonC
źródło
8
Zdalna gałąź śledzenia jest odtwarzana po pobraniu git. Czy można je wykluczyć?
Matt R
1
@Matt: Wierzę, że można to zrobić, ustawiając ustawienie remote.<name>.fetchkonfiguracji refspec, ale nie jestem pewien, czy można wykluczyć gałąź podczas określania refspec.
VCC,
Tak mi się też wydawało; Byłem jednak w stanie bazować na moim lokalnym oddziale i po przewinięciu do przodu pozorne połączenie między gałęziami zniknęło.
willoller,
7
@ruffin: jest to całkowicie normalne: git branch -d -r origin/<remote branch name>usunie zdalną gałąź śledzenia zadeklarowaną lokalnie w twoim repozytorium. To będzie nie usunąć gałąź na samej zdalnego repo (tylko git push :developmentto zrobi). Więc kiedy przesuwasz swój lokalny development, z historią inną niż gałąź zdalnego programowania (na zdalnym repozytorium), nadal otrzymasz non-fast-forwardostrzeżenie.
VCC
1
@Marco prawda, ale i tak wolę to robić, uważam to za „czystsze”.
VCC z
200

Aby usunąć upstream dla bieżącego oddziału:

$ git branch --unset-upstream

Jest to dostępne dla Git v.1.8.0 lub nowszej. (Źródła: 1.7.9 , 1.8.0 )

źródło

Yoshua Wuyts
źródło
20
Powinna być wybrana odpowiedź.
kaiser
9
Jeśli nie chcesz usuwać bieżącej gałęzi, po prostu:git branch --unset-upstream [branchname]
Sonata,
2
Wygląda na to, że jest nowy. Przydałoby się trochę więcej informacji. Np. Wersja wstępu.
ManuelSchneid3r
Pewnie, że tak, nie krępuj się odpowiedzieć, gdy się dowiesz, a ja z przyjemnością zaktualizuję komentarz
Yoshua Wuyts
Hmm, dostaję się fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. po zrobieniu tego i wypróbowaniu git pull origin / master
information_interchange
106

Aby usunąć powiązanie między lokalnym i zdalnym uruchomieniem oddziału:

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

Opcjonalnie usuń później oddział lokalny, jeśli go nie potrzebujesz:

git branch -d <branch>

To nie usunie zdalnej gałęzi.

Dobes Vandermeer
źródło
11
git branch -d <branch>nie jest wymagane do usunięcia powiązania.
Marco
1
Używam JIRA. Kiedy ponownie pociągnę, pojawi się gałąź. Jak mogę temu zapobiec?
proszek 366
1
@Marco Prawidłowo, ale jeśli użyjesz git branch -vv, nadal zobaczysz stare gałęzie, dopóki tego nie zrobisz git branch -d <branch>.
SeldomNeedy
@ powder366 W zależności od ustawień git pullmoże pobrać wszystkie zdalne gałęzie i ponownie dodać dowolne, które uzna za „pojawiły się” na pilocie. Możesz zmienić to zachowanie „wyciągnij wszystkie gałęzie”, wykonując git config [--global] push.default simplelub git config [--global] push.default current. Więcej push.defaulttutaj .
SeldomNeedy
1
@SeldomNeedy Wydaje mi się, że brakuje Ci punktu DVCS? Chodzi o to, że mogę mieć gałąź, która zaczyna śledzić gałąź nadrzędną, ale odłączam się, aby zastosować podejście, którego nie używa gałąź nadrzędna. W takim przypadku gałąź nie jest ani „stara” (ponieważ wciąż się nad nią rozwijam), ani „nieużywana” (ponieważ go używam). To duża część projektu DVCS .. Czy to ma sens?
Marco
33

Najprostszym sposobem jest edycja .git/config

Oto przykładowy plik

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

Usuń linię merge = refs/heads/test1w test1sekcji oddziału

Jacob Groundwater
źródło
3
+1 Nie mogę definitywnie powiedzieć, że jest to najłatwiejsza metoda, ale z pewnością okazuje się najłatwiejsza do zrozumienia (i mam nadzieję, że o tym pamiętam)!
mędrzec
Ładne rozwiązanie +1. W rzeczywistości jest to miejsce, w którym śledzenie jest zarejestrowane, łatwe do zmiany, jasne, co robi. Linia poleceń .git/configjest również dostępna.
hakre 24.04.13
5
fyi, jest to to samo co rozwiązanie „git config --unset” firmy Dobes Vandermeer. „git config” edytuje ten plik.
JZ
10

Możesz usunąć gałąź zdalnego śledzenia za pomocą

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

jak wspomniano powyżej VonC. Jeśli jednak zachowasz lokalną kopię gałęzi, git push nadal będziesz próbował wypchnąć tę gałąź (co może dać ci błąd szybkiego przewijania, tak jak w przypadku ruffin ). Jest tak, ponieważ push.defaultdomyślna konfiguracja matchingoznacza:

dopasowywanie - wypychaj wszystkie pasujące gałęzie. Wszystkie gałęzie o tej samej nazwie na obu końcach są uważane za pasujące. To jest domyślne.

(patrz http://git-scm.com/docs/git-config pod push.default)

Ponieważ po usunięciu gałęzi zdalnego śledzenia prawdopodobnie nie jest to pożądane, możesz ustawić push.defaultna upstream(lub trackingjeśli masz git <1.7.4.3)

upstream - pchnij bieżącą gałąź do jej gałęzi upstream.

za pomocą

git config push.default upstream

a git przestanie próbować wypychać gałęzie, które „przestałeś śledzić”.

Uwaga: prostszym rozwiązaniem byłoby po prostu zmiana nazwy lokalnego oddziału na coś innego. To również wyeliminowałoby pewien potencjał do zamieszania.

CletusW
źródło
3

Oto jedna linijka do usunięcia wszystkich gałęzi zdalnego śledzenia pasujących do wzorca:

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

infomaniac
źródło
Jeśli tylko śledzenie zdalne ma być śledzone (usuwane), myślę, że jest to krótsza alternatywa dla jednej linii:git branch -r -D $(git branch -r | grep -v "master")
dma_k
1

To nie jest odpowiedź na pytanie, ale nie mogłem wymyślić, jak uzyskać przyzwoite formatowanie kodu w powyższym komentarzu ... więc auto-down-reputation-be-cholera, oto mój komentarz.

Mam przepis przesłany przez @Dobes w fantazyjnym shmancy [alias] w moim .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"

Wtedy mogę po prostu uciec

$ git bruntrack branchname
qneill
źródło
1
+1. Niezły alias, oprócz mojej powyższej odpowiedzi .
VonC
-1

git branch --unset-upstream przestaje śledzić wszystkie lokalne oddziały, co nie jest pożądane.

Usuń [branch "branch-name"]sekcję z .git/configpliku, a następnie

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

dla mnie działa najlepiej.

Kok
źródło
-1

W ten sposób możesz usunąć swój zdalny oddział

git remote remove <your remote branch name>
Zawieszony
źródło
1
Spowodowałoby to usunięcie wszystkich gałęzi zdalnego śledzenia dla tego zdalnego: jeśli masz więcej niż jeden, może to być problematyczne.
VonC
-2

Najprostszym sposobem na to jest zdalne usunięcie oddziału, a następnie użycie:

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

Mark Caudill
źródło
14
Jestem zdezorientowany, OP nie chciał usunąć zdalnej gałęzi.
madth3
Dobrze jest usunąć śledzone zdalne gałęzie z lokalnego repozytorium, które zostało usunięte w zdalnym repozytorium gołym.
Marek Podyma