Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: saketrpОтветов: 1

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

Я искал безопасный способ удалить все такие ветки. из описания казалось, что 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>`
  • Попробуйте git remote prune origin --dry-run проверить устаревшие ветки Shubham Khatri 16.02.2018
  • git remote prune origin --dry-run вывод пуст saketrp 16.02.2018
  • @ShubhamKhatri возвращается пустым, потому что удаленной ветки отслеживания больше нет. И bugfix/encrdb_init является локальным (в имени ветки может быть косая черта) VonC 16.02.2018
  • вы должны получить список your stale remote-tracking branches с помощью указанной выше команды. Если вы его не получили, вероятно, что-то еще не так Shubham Khatri 16.02.2018
  • Возможный дубликат Что такое различия между git remote prune, git prune, git fetch --prune и т. д. ckruczek 16.02.2018
  • Спасибо, похоже, что команда удаляет только ветки в remote, но не удаляет локальную ветку, которая теперь остается зависшей. Похоже, что команда не удаляет локальные ветки, даже те, которые вышли из восходящего потока. saketrp 16.02.2018

gitgit-branchgit-remote

Ответы

Ответ 1 · рейтинг 14 · VonC

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

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

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

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

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)"

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы