Удалить все ветки git уже нажал - PullRequest
1 голос
/ 08 июля 2019

Моя потребность

Привет, я ищу команду удалить все локальные ветви уже выдвинули в начало координат.

Особенно я хочу сохранить все ветки с коммитами, которые еще не отправлены в соответствующие удаленные ветки.

Причина

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 июля 2019

Хотя это выглядит как слепой слон в отношении ловкого и умного решения, предложенного jthill, я разделяю здесь жестокий подход, который я склонен использовать до сих пор для той же потребности, которую вы описываете:

# nuke all branches* (which have no unique commit)
git branch -d $(git for-each-ref --format="%(refname:short) refs/heads")

# for "main" branches (I mean permanent, like master), recreate them if needed from remote
git checkout master

Это однократная версия, но для удобства ее можно легко создать из псевдонима.

Обратите внимание на флаг -d, который в отличие от -D означает «мягкое удаление» и отказывается от удаленияветви с неотправленными коммитами (safecheck игнорируется -D).


* здесь, git может (в зависимости от состояния текущей ветки) жаловаться на невозможность удалить ветку, которую вынаНичего страшного в прямом командном режиме, но немного раздражает псевдоним.Просто зацените ложную ветку заранее и удалите ее потом.Так как, конечно, мы обнуляем все, я склонен называть ветвь from-orbit.

3 голосов
/ 08 июля 2019
git remote update # `git fetch --all` but it allows configurable skipping, see the docs
git for-each-ref refs/heads --format='
        [[ "%(upstream)" != "" ]] &&    # there is an upstream branch
        git merge-base --is-ancestor %(refname) %(upstream) &&  # which has this tip
        echo delete %(refname)
' # | sh # | git update-ref --stdin

Генерация команд для оболочки полезна и забавна - если вы выполнили вышеприведенное указание, оно на самом деле ничего не сделает с вашим репозиторием, а вместо этого выводит команды для проверки, находится ли ветка в восходящем потоке; удалите #, и он выполнит проверки вместо того, чтобы просто распечатать их, попробуйте.

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