Як зупинити відстеження віддаленої гілки в Git?


556

Як зупинити відстеження віддаленої гілки в Git ?

Я прошу припинити відстеження, оскільки в конкретному випадку я хочу видалити локальну гілку, але не віддалену. Видалення локального та висунення видалення на віддалене також видалить віддалену гілку:

Чи можу я це зробити git branch -d the_branch, і це не буде поширюватися, коли я пізніше git push?

Чи поширюватиметься вона лише тоді, коли я буду бігати git push origin :the_branchзгодом?

Відповіді:


708

Як уже згадувалося в Yoshua Уітс ' відповідь , використовуючи git branch:

git branch --unset-upstream

Інші варіанти:

Вам не доведеться видаляти локальну філію.

Просто видаліть локальну гілку, яка відстежує віддалену гілку:

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

-r, --remotesповідомляє git видалити гілку віддаленого відстеження (тобто видалити набір гілки для відстеження віддаленої гілки). Це буде НЕ видалити гілку на віддалений репозиторій !

Див. Розділ " Важко зрозуміти git-fetch "

немає такої концепції локальних гілок стеження, лише віддалені гілки відстеження.
Так origin/masterє відділення віддаленого відстеження masterв originРЕПО

Як уже згадувалося в DOBES Вендермір «s відповідь , також необхідно скинути настройки , пов'язані з локальної гілки:

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

Видаліть інформацію про течію для <branchname>.
Якщо не вказано жодної гілки, вона за замовчуванням відповідає поточній гілці.

(git 1.8+, жовтень 2012, зробити b84869e від Carlos Martín Nieto ( carlosmn) )

Це зробить будь-яке поштовх / потяг абсолютно невідомим origin/<remote branch name>.


8
Гілка віддаленого відстеження відтворена після отримання git. Чи можливо їх виключити?
Метт Р

1
@Matt: Я вважаю, що це можна зробити, встановивши налаштування remote.<name>.fetchrefspec config, але я не впевнений, чи можна виключати гілку при введенні refspec.
VonC

Це виявилося і мені; Мені вдалося відновити місцеве відділення, хоча і після швидкого переходу вперед очевидний зв'язок між гілками зник.
willoller

7
@ruffin: це абсолютно нормально: git branch -d -r origin/<remote branch name>буде видалено гілку відстеження, як оголошено локально , у вашому репо. Він не видалить гілку на самому віддаленому РЕПО (лише це git push :developmentзробить). Тож, коли ви натискатимете свій локальний development, з історією, відмінною від гілки віддаленого розвитку (на віддаленому репо), ви все одно отримаєте non-fast-forwardпопередження.
VonC

1
@Marco правда, але я вважаю за краще робити це все одно, я вважаю його "чистішим".
VonC

200

Щоб видалити висхідний потік для поточної гілки, виконайте:

$ git branch --unset-upstream

Це доступно для Git v.1.8.0 або новішої версії. (Джерела: 1.7.9 ref , 1.8.0 ref )

джерело


20
Повинна була бути обрана відповідь.
кайзер

9
Якщо ви не хочете видалити поточну гілку, просто:git branch --unset-upstream [branchname]
Соната

2
Схоже, це нове. Трохи більше інформації було б непогано. Наприклад версія вступу.
ManuelSchneid3r

Звичайно,
сміливо

Хм, я отримую fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. після цього і спробую git pull origin / master
information_interchange

106

Щоб видалити зв'язок між локальним та віддаленим запуском гілки:

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

За бажанням видаліть локальну гілку згодом, якщо вона вам не потрібна:

git branch -d <branch>

Це не видалить віддалену гілку.


11
git branch -d <branch>це НЕ потрібно , щоб видалити зв'язок.
Марко

1
Я використовую JIRA. Коли я знову тягну, з’являється гілка. Як я можу запобігти цьому?
порошок366

1
@Marco Правильно, але якщо ви користуєтеся, git branch -vvви все одно побачите старі гілки, поки ви цього не зробите git branch -d <branch>.
SeldomNeedy

@ pow366 Залежно від ваших налаштувань, git pullможливо захопити всі віддалені гілки та повторно додати все, що вважається, що "з'явилося" на віддаленому. Ви можете змінити цю поведінку "витягнути всі гілки", виконавши git config [--global] push.default simpleабо git config [--global] push.default current. Детальніше push.defaultтут .
SeldomNeedy

1
@SeldomNeedy Я думаю, ви, можливо, не вистачаєте точки DVCS? Справа в тому, що у мене може бути гілка, яка починає відстежувати гілку вгору за течією, але я відключаюсь для того, щоб дотримуватися підходу, який не використовує гілка вище за течією. У такому випадку гілка не є ні "старою" (тому що я все ще розвиваюсь на ній), ні "не використовується" (тому що я її використовую). Це велика частина дизайну DVCS. Це має сенс?
Марко

33

Найпростіший спосіб - це редагування .git/config

Ось файл прикладу

[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

Видаліть рядок merge = refs/heads/test1у розділі test1відділення


3
+1 Я не можу остаточно сказати, що це найпростіший метод, але він, безумовно, виявляється найпростішим для мене зрозуміти (і, сподіваюся, для цього запам'ятати)!
шавлія

Приємне рішення +1. Це насправді місце, де зареєстровано відстеження, легко змінити, зрозуміти, що він робить. .git/configДоступний і командний рядок .
хакре

5
fyi, це те саме, що рішення "git config --unset" від Dobes Vandermeer. "git config" редагує цей файл.
JZ

10

Ви можете видалити гілку віддаленого відстеження за допомогою

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

як згадується вище VonC. Однак якщо ви зберігаєте свою локальну копію відділення,git push вона все одно намагатиметься просунути цю гілку (що може призвести до помилки , що не переходить вперед, як це було зроблено для ruffin ). Це пояснюється тим, що налаштування push.defaultза замовчуванням у налаштуваннях matchingозначає:

відповідність - натисніть на всі відповідні гілки. Усі гілки, що мають однакове ім’я в обох кінцях, вважаються збігаються. Це за замовчуванням.

(див. http://git-scm.com/docs/git-config під push.default)

Бачачи, що це, мабуть, не те, чого ви хотіли, коли ви видаляли гілку віддаленого відстеження, ви можете встановити push.default значення upstream(або trackingякщо у вас git <1.7.4.3)

вгору за течією - натисніть на поточну гілку до її верхньої гілки.

використовуючи

git config push.default upstream

і git перестане намагатися просунути гілки, які ви "припинили відстежувати".

Примітка . Найпростішим рішенням буде просто перейменувати свою місцеву гілку на щось інше. Це також усуне певний потенціал для плутанини.


3

Ось однолінійка для видалення всіх гілок віддаленого відстеження, що відповідають шаблону:

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


Якщо слід відслідковувати (видаляти) лише гілки віддаленого відстеження, я думаю, це коротша однорядкова альтернатива:git branch -r -D $(git branch -r | grep -v "master")
dma_k

1

Це не відповідь на питання, але я не міг зрозуміти, як отримати гідне форматування коду в коментарі вище ... так що авто-вниз-репутація-проклята ось мій коментар.

У мене рецепт @Dobes підроблений [псевдонім] в моєму .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"

Тоді я можу просто бігти

$ git bruntrack branchname

1
+1. Гарний псевдонім, крім моєї відповіді вище .
VonC

-1

git branch --unset-upstream перестає відслідковувати всі локальні гілки, що небажано.

Видаліть [branch "branch-name"]розділ з .git/configфайлу, за яким далі

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

працює найкраще для мене.


-1

Ви можете скористатися цим способом для видалення віддаленої гілки

git remote remove <your remote branch name>

1
Це видалить усі гілки віддаленого відстеження для цього віддаленого: якщо у вас є декілька, це може бути проблематично.
VonC

-2

Найпростіший спосіб зробити це - видалити гілку віддалено, а потім скористатися:

git fetch --prune (він же git fetch -p)


14
Я розгублений, ОП не хотів видаляти віддалену гілку.
madth3

Добре очищати відстежені віддалені гілки з локального сховища, яке було видалено з віддаленого голого сховища.
Марек Подима
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.