Как перестать отслеживать удаленную ветку в Git?

Как перестать отслеживать удаленную ветку в Git?

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

Могу я просто сделать git branch -d the_branch, и это не будет распространяться, когда я позже git push?

Будет ли распространяться только если я должен был бежать git push origin :the_branch позже?

11 ответов

Решение

Как упоминалось в Yoshua Wuyts, используя git branch:

git branch --unset-upstream

Другие опции:

Вам не нужно удалять местное отделение.

Просто удалите удаленную ветку отслеживания:

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

(Это не удалит ветку на удаленном репо!)

Смотрите " Трудно понять git-fetch "

нет такой концепции локальных отслеживающих ветвей, только удаленные отслеживающие ветви.
Так origin/master это ветка удаленного отслеживания master в origin Сделки рЕПО

Как упоминалось в Dobes Vandermeer, вам также необходимо сбросить конфигурацию, связанную с локальной веткой:

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

Удалить вышестоящую информацию для <branchname>,
Если ветка не указана, по умолчанию используется текущая ветка.

(git 1.8+, октябрь 2012, коммит b84869e Карлоса Мартина Ньето ( carlosmn ))

Это сделает любой толчок совершенно незаметным origin/<remote branch name>,

Чтобы удалить восходящий поток для текущей ветви, выполните:

$ git branch --unset-upstream

Это доступно для Git v.1.8.0 или новее. (Источники: 1.7.9 ref, 1.8.0 ref)

источник

Чтобы удалить связь между локальной и удаленной ветками, выполните:

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

При необходимости удалите локальную ветку, если она вам не нужна:

git branch -d <branch>

Это не удалит удаленную ветку.

Самый простой способ - отредактировать .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 раздел филиала

TL; DR;

Вы можете перезаписать текущий список веток удаленного отслеживания своим собственным списком желаемых веток удаленного отслеживания:

      ❯ git remote set-branches <REMOTE> <YOUR-BRANCH-LIST>

Если вы дополнительно хотите удалить [локально расположенные] ветки удаленного отслеживания, которые вам больше не нужны, вы можете сделать это с помощью:

      ❯ git branch --delete --remotes -- <REMOTE>/<BRANCH>
Deleted remote-tracking branch <REMOTE>/<BRANCH> (was 1f1a655).

При добавлении / связывании удаленного репо с вашим локальным вы можете указать, какие [локально расположенные] удаленные ветки отслеживания вы хотите создать с помощью -t <BRANCH>:

      ❯ git remote add demo ../demo-remote -t master -t foo -t bar

Кроме того, предоставляет команду только для вашего вопроса: git remote set-branches <REMOTE> <YOUR-BRANCH-LIST>. git перезапишет текущий список [локально расположенных] ветвей удаленного отслеживания для указанного удаленного <REMOTE> с указанным списком филиалов: <YOUR-BRANCH-LIST>.

      ❯ git remote show demo
* remote demo
…
  Remote branches:
    bar    new (next fetch will store in remotes/demo)
    foo   new (next fetch will store in remotes/demo)
    master new (next fetch will store in remotes/demo)
…
❯ git remote set-branches demo master foo
❯ git remote show demo
* remote demo
…
  Remote branches:
    foo    new (next fetch will store in remotes/demo)
    master new (next fetch will store in remotes/demo)
…

Затем вы можете удалить [локально расположенные] ветки удаленного отслеживания для соответствующих [удаленных] удаленных ветвей, с помощью которых вы больше не отслеживаете git branch --delete --remotes -- <REMOTE>/<BRANCH>

      ❯ git branch --delete --remotes -- demo/bar
Deleted remote-tracking branch demo/bar (was 1f1a655).

  • git-remote (1):

    set-branches: Изменяет список ветвей, отслеживаемых указанным удаленным устройством. Это можно использовать для отслеживания подмножества доступных удаленных ветвей после начальной настройки удаленного.

Вы можете удалить ветку удаленного отслеживания, используя

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)

upstream - выдвинуть текущую ветвь в ее восходящую ветвь.

с помощью

git config push.default upstream

и git прекратит попытки выдвинуть ветки, которые вы "перестали отслеживать".

Примечание: более простым решением было бы просто переименовать вашу локальную ветку в другое. Это также устранит потенциальную путаницу.

Вот одна строка для удаления всех ветвей удаленного отслеживания, соответствующих шаблону:

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

Это не ответ на вопрос, но я не мог понять, как получить приличное форматирование кода в комментарии выше... так вот мой комментарий: auto-down-reputation-be-damd

У меня есть рецепт, добавленный @Dobes в причудливую запись shmancy [alias] в моем.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

Самый простой способ сделать это - удалить ветку удаленно, а затем использовать:

git fetch --prune (также известный как git fetch -p)

git branch --unset-upstream перестает отслеживать все местные филиалы, что нежелательно.

Удалить [branch "branch-name"] раздел из .git/config файл с последующим

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

работает лучше для меня.

Вы можете использовать этот способ для удаления удаленной ветки

git remote remove <your remote branch name>
Другие вопросы по тегам