Удалите локальные ветки 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)