git remote prune origin не удаляет локальную ветвь, даже если удаленная ветвь восходящего потока удалена

Это обычный вариант использования для меня: я клонирую репозиторий, проверяю ветку, делаю некоторые изменения кода, делаю несколько коммитов, затем, когда он стабильный, я нажимаю на удаленный, в конечном итоге ветка объединяется и удаляется. и у меня остается местная ветка, в которой нет восходящего потока.

Я искал безопасный способ удалить все такие ветки. из описания казалось, что git remote prune origin делает именно это. Но, похоже, у меня это не работает.

Видя следующее поведение, ветвь encrdb_init была удалена из remote, но команда git remote prune origin, похоже, не сокращает ее. Не знаю почему.

$ git branch
  bugfix/encrdb_init
  * master
$
$ git remote prune origin
$
$ git checkout bugfix/encrdb_init
  Switched to branch 'bugfix/encrdb_init'
  Your branch is based on 'origin/bugfix/encrdb_init', but the upstream 
  is gone.
  (use "git branch --unset-upstream" to fixup)
$
$ git branch
  bugfix/encrdb_init <<< shouldn't this have been pruned?
  * master

для справки добавляем вывод git remote show origin

$ git remote show origin
* remote origin
  Fetch URL: <redacted>
  Push  URL: <redacted>
  HEAD branch: master
  Remote branches:
    SSL_test                                                  tracked
    addNodeFix                                                tracked
    autoprefix                                                tracked
    release/1.0.2                                             tracked
  Local branches configured for 'git pull':
    bugfix/encrdb_init          merges with remote bugfix/encrdb_init
    master                      merges with remote master
    release/1.0.2               merges with remote release/1.0.2
  Local refs configured for 'git push':
    master                 pushes to master                 (up to 
date)
    release/1.0.2          pushes to release/1.0.2          (up to 
date)

$ git branch -vv
* bugfix/encrdb_init          341a078c [origin/bugfix/encrdb_init: gone] <redacted comment>`

person saketrp    schedule 16.02.2018    source источник
comment
Попробуйте git remote prune origin --dry-run проверить устаревшие ветки   -  person Shubham Khatri    schedule 16.02.2018
comment
git remote prune origin --dry-run вывод пуст   -  person saketrp    schedule 16.02.2018
comment
@ShubhamKhatri возвращается пустым, потому что удаленной ветки отслеживания больше нет. И bugfix/encrdb_init является локальным (в имени ветки может быть косая черта)   -  person VonC    schedule 16.02.2018
comment
вы должны получить список your stale remote-tracking branches с помощью указанной выше команды. Если вы его не получили, вероятно, что-то еще не так   -  person Shubham Khatri    schedule 16.02.2018
comment
Возможный дубликат Что такое различия между git remote prune, git prune, git fetch --prune и т. д.   -  person ckruczek    schedule 16.02.2018
comment
Спасибо, похоже, что команда удаляет только ветки в remote, но не удаляет локальную ветку, которая теперь остается зависшей. Похоже, что команда не удаляет локальные ветки, даже те, которые вышли из восходящего потока.   -  person saketrp    schedule 16.02.2018
comment
@saketrp да, это все, что нужно git remote: обновить или удалить в пространстве имен remotes. Не вмешиваться в местные отделения.   -  person VonC    schedule 16.02.2018
comment
Я обновил свой ответ фактическими командами, которые удаляют нужные вам ветки.   -  person VonC    schedule 16.02.2018


Ответы (1)


Только команда git remote prune удаляет ветки удаленного отслеживания в пространстве имен remotes/origin.

Не локальные ветки.
Обычно удаляют только объединенные локальные ветки.

git branch (даже с -vv) показывает только локальные ветки.
В ветке может быть косая черта в его имя

Ветвь удаленного отслеживания находится в пространстве имен remotes/origin и записывает, что было получено.
восходящая ветвь < / strong> - это удаленная ветка, связанная с локальной ветвью, чтобы указанная локальная ветвь знала, куда отправлять.

git remote prune правильно удаляет ветвь удаленного отслеживания, которая является ветвью восходящего потока для локальной bugfix/encrdb_init ветки.
Вот почему вы видите origin/bugfix/encrdb_init: gone: ветка удаленного отслеживания отсутствует.


ОП добавляет:

Судя по описанию, git remote prune origin делает именно это. Но, похоже, у меня это не работает.

Нет, в описании не упоминаются местные отделения.

Удаляет все устаревшие ветки удаленного отслеживания в <name>.
Эти устаревшие ветки уже были удалены из удаленного репозитория, на который ссылается <name>, но все еще локально доступны в «remotes/<name>».

<name> здесь имя удаленного репо, на которое ссылается git remote -v.
Обычно "origin".
git remote prune удаляет ветки, зарегистрированные в remotes/origin (не "удаленные (-ые)" ). Он не удалит локальные ветки.

Чтобы «безопасно» удалить локальные ветки, вам необходимо:

Последний вариант ненадежен:

  • Я предпочитаю использовать git branch -d вместо -D, чтобы удалить только те ветки, которые уже объединены.
  • вы можете в конечном итоге удалить ветки с сообщением фиксации, содержащим строку ": gone"

лучший способ перечислить эти ветки:

git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)"
person VonC    schedule 16.02.2018
comment
OP пытается git remote prune origin, который должен удалить устаревшие ветки из локального, ваш ответ не отвечает на вопрос - person Shubham Khatri; 16.02.2018
comment
Да, ветка bugfix/encrdb_init была объединена с ведущей и удалена на удаленном компьютере, но git не удаляет ее. - person saketrp; 16.02.2018
comment
@saketrp мои ответы стоят: git remote prune не удаляет локальную ветку. bugfix / encrdb_init - это локальная ветка. - person VonC; 16.02.2018
comment
@ShubhamKhatri, мой ответ остается в силе. - person VonC; 16.02.2018
comment
Разве это не отслеживающая ветка? как видно из вывода git remote show origin - person saketrp; 16.02.2018
comment
@saketrp нет, это не так. - person VonC; 16.02.2018
comment
@VonC Как я могу это увидеть? Даже подробный вывод команды показывает это, разве это не означает, что это ветвь отслеживания? - person saketrp; 16.02.2018
comment
Только git branch дает вам только локальные ветки. Он показывает вам локальную ветвь и упоминает, что ее восходящая ветка исчезла. - person VonC; 16.02.2018
comment
@saketrp Мне нужно на работу, я наверняка пойму позже. А пока мой ответ остается в силе. - person VonC; 16.02.2018
comment
Конечно, но разве локальная ветвь с восходящим потоком не совпадает с ветвью отслеживания? и разве эта команда не должна удалять такие ветки, в которых нет восходящего потока? Если нет, какова точная цель этой команды? - person saketrp; 16.02.2018
comment
@saketrp Я только что отредактировал ответ, чтобы добавить ссылки и отсылки - person VonC; 16.02.2018