Удалите локальные ветки Git после удаления их в удаленном репо

Я хочу, чтобы локальные и удаленные репозитории всегда синхронизировались в терминах ветвей.

После просмотра запроса Pull на GitHub, я объединяю и удаляю ветвь там (удаленный). Как я могу получить эту информацию в своем локальном репозитории и получить Git, чтобы удалить мою локальную версию ветки?

Ответ 1

Быстрый способ

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

NB: если вы не на master, это может удалить ветвь. Продолжайте читать "лучший способ".

Убедитесь, что мы сохраняем мастер

Вы можете убедиться, что master или любая другая ветвь, если это не так, не удаляется с помощью grep ing для большего. В этом случае вы должны пойти:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

Итак, если мы хотим сохранить master, develop и staging, например, мы бы пошли:

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

Сделайте это псевдонимом

Так как это немного длиннее, вы можете добавить псевдоним к .zshrc или .bashrc. Мина называется gbpurge (для git branches purge):

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

Затем перезагрузите .bashrc или .zshrc:

. ~/.bashrc

или

. ~/.zshrc

Ответ 2

Я использую тот же поток с GitHub и не нашел предыдущих ответов, удовлетворяющих мне, поскольку git branch --merged перечисляет ветки, которые были объединены, но не каждый из них удален удаленно в моем случае. Итак, это сработало для меня:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

где:

  • git fetch --all -p: обновить статус локальных веток
  • git branch -vv: указать статус локальных веток
  • grep ": gone]": удалить фильтры
  • awk '{ print $1 }': извлечь их имена
  • xargs -n 1 git branch -d: передать имя команде delete

Примечание: если вы предпочитаете, вы можете использовать -d вместо -d, который принудительно удаляет.

Например:

[email protected]:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

[email protected]:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

[email protected]:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

Справка:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches

Ответ 3

попробовать:

git pull --prune

который удаляет ваш локальный филиал, если его удаленная ветвь удалена.

Обновлено:

Вышеприведенное утверждение неверно.

Фактически, запуск git pull --prune будет только удалять ветки удаленного отслеживания, такие как

remotes/origin/fff
remotes/origin/dev
remotes/origin/master

Затем вы можете запустить git branch -r, чтобы проверить ветки удаленного отслеживания, оставленные на вашем компьютере. Предположим, что левые ветки:

origin/dev
origin/master

что означает, что ветвь origin/fff удалена.

Итак, после запуска git pull --prune просто запустите:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

вы можете узнать все локальные ветки, которые:

  • больше нет корректирующих удаленных веток;
  • можно безопасно удалить.

тогда <the command above> | xargs git branch -d может удалить все из них.

Ответ 4

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

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d

Ответ 5

Для людей, использующих powershell, это эквивалентно answer :

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  • Отфильтровать все ветки, отмеченные как пропавшие
  • Вызов git branch -D для каждой из найденных ветвей

Ответ 6

Ничего из этого не было для меня. Вы можете увидеть мой другой ответ здесь: fooobar.com/questions/13716/...

Но по существу, теперь у меня это есть в моем ~/.gitconfig:

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d

Ответ 7

Очень простое решение: удалите локальное репо и заново запустите пульт. Может показаться не очень изящным, но это просто, и вы точно поймете, что делаете, не читая man-страницы:-).

Ответ 8

Я написал этот однострочный список для отображения всех локальных ветвей, которые не имеют соответствующей удаленной ветки:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

После этого удалите эти локальные ветки с помощью xargs:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d

Ответ 9

Я просто делаю это, чтобы удалить объединенные локальные ветки:

git branch -d $(git branch --merged)

и в случае, если вы хотите удалить несуществующие трекинга:

git pull --prune

Ответ 10

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

git branch -d branch_name_to_delete

Если вы сейчас находитесь в этой ветке, он вернет вас к мастеру. В этот момент

git pull

Ответ 11

Проголосовавший ответ имеет возможность удалить мастер. Признайте нижеприведенный практический пример.

У меня было две ветки функций hemen_README и hemen_BASEBOX, которые были объединены в разработку, а затем разработка была объединена с мастером. Отделения функций hemen_README и hemen_BASEBOX удалены удаленно, но все еще отображаются локально. Также я не на хозяине локально, но на разработке.

В этом случае

    [email protected]:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                      671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
        hemen_README                 ba87489 Updated Readme with considerable details
        master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
        remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
        remotes/origin/master        2f093ce Merged in develop (pull request #3)

Итак, если я запустил указанную выше частичную команду

    [email protected]:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

Обратите внимание, что он также показывает мастер, который в конечном итоге будет удален.

В любом случае я смог это сделать. Я делюсь своим сеансом с вами на том, как я это достиг.

    [email protected]:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    [email protected]:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: [email protected]:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README

Я только что проверил, что он будет обрезан, а затем обрезается. глядя на командную строку ниже, мы позаботились о пульте дистанционного управления

    [email protected]:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
        hemen_README           ba87489 Updated Readme with considerable details
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

Теперь идите и удалите локальные ветки

    [email protected]:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    [email protected]:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).

Хорошо, ветки по желанию.

    [email protected]:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)