Я бы обычно не отвечал на вопрос, в котором уже есть 16 ответов, но все остальные ответы неверны, а правильный ответ очень прост.В вопросе говорится: «Есть ли простой способ удалить все ветви отслеживания, удаленный эквивалент которых больше не существует?»
Если «простой» означает удаление их всех за один раз, не хрупкое, не опасное и не зависящееЧто касается инструментов, которые есть не у всех читателей, то правильный ответ: нет.
Некоторые ответы просты, но они не выполняют то, что просили.Другие делают то, что просили, но не все просто: все полагаются на синтаксический анализ выходных данных Git с помощью команд манипулирования текстом или языков сценариев, которые могут отсутствовать в каждой системе.Кроме того, в большинстве предложений используются фарфоровые команды, выходные данные которых не предназначены для анализа сценарием («фарфор» относится к командам, предназначенным для работы с человеком; в сценариях должны использоваться низкоуровневые команды «слесарного дела»).
Дополнительное чтение:
Если вы хотите сделать это безопасно, для рассматриваемого варианта использования (ветви отслеживания сбора мусора, которыебыли удалены на сервере, но все еще существуют как локальные ветви), и только с помощью команд Git высокого уровня необходимо
git fetch --prune
(или git fetch -p
, который является псевдонимом, или git prune remote origin
, которая делает то же самое без извлечения, и, вероятно, не то, что вы хотите большую часть времени). - Обратите внимание на все удаленные ветки, которые отмечены как удаленные.Или, чтобы найти их позже,
git branch -v
(любая потерянная ветвь отслеживания будет помечена как «[ушел]»). git branch -d [branch_name]
в каждой потерянной ветке отслеживания
(это то, что предлагают другие ответы).
Если вы хотите написать сценарий решения, тогда for-each-ref
является вашей отправной точкой, как в Отметьте ответ Лонгаира здесь и этот ответ на другой вопрос , но я не вижу способа использовать его без написания цикла сценария оболочки или использования xargs или чего-то еще.
Фоновое объяснение
Чтобы понять, что происходит, нужно понимать, что в ситуации отслеживания веток у вас есть не одна ветка, а три.(И помните, что «ветвь» означает просто указатель на коммит.)
При наличии отслеживающей ветки feature/X
удаленный репозиторий (сервер) будет иметь эту ветвь и будет вызывать ее feature/X
.Ваш локальный репозиторий имеет ветку remotes/origin/feature/X
, что означает: «Это то, что удаленный сообщил мне, что это была его особенность / ветвь X, когда мы говорили в прошлый раз», и, наконец, локальный репозиторий имеет ветку feature/X
, которая указывает на ваш последнийcommit и настроен на «отслеживание» remotes/origin/feature/X
, что означает, что вы можете тянуть и нажать, чтобы сохранить их выравнивание.
В какой-то момент кто-то удалил feature/X
на пульте.С этого момента у вас останется ваш локальный feature/X
(который вам, вероятно, больше не нужен, так как работа над функцией X предположительно завершена), и ваш remotes/origin/feature/X
, который, безусловно, бесполезен, потому что его единственной целью было запомнитьсостояние ветви сервера.
И Git позволит вам автоматически очистить избыточный remotes/origin/feature/X
- это то, что делает git fetch --prune
- но по какой-то причине он не позволяет автоматически удалять вашивладеть feature/X
... даже если ваш feature/X
по-прежнему содержит потерянные данные отслеживания, поэтому он содержит информацию для идентификации бывших отслеживающих ветвей, которые были полностью объединены.(В конце концов, он может дать you информацию, которая позволит вам выполнить операцию вручную.)