Git: Как мне отображать локальные ветки, отслеживающие удаленные ветки, которые больше не существуют?

Как я могу перечислить любые локальные ветки, которые появляются (как .git/config), для отслеживания удаленных веток, которые больше не существуют? В этом случае удаленные ветки находятся на GitHub, но я подозреваю, что их местоположение не имеет отношения.

Например:

  • У меня есть локальные ветки, a, b, c и d.
  • a отслеживает origin/a и c отслеживает origin/c.
  • b и d не отслеживают удаленные ветки.
  • origin/a был снова объединен с мастером и был удален во время очистки репозитория; Мне больше не нужно сохранять локальную ветвь a.
  • Если локальная ветвь a выгружается в рабочее дерево, запуск git fetch или git pull приводит к ошибке Your configuration specifies to merge with the ref 'a' from the remote, but no such ref was fetched.

Как мне создать список, содержащий только a и любые другие локальные ветки, которые, как представляется, отслеживают удаленные ветки, которые больше не существуют?

Я хотел бы идентифицировать их, чтобы удалить устаревшие локальные ветки, которые мне больше не нужны.

В список не должны входить локальные ветки b или d, которые не отслеживают удаленные ветки, а также не c, которые отслеживают origin/c, которые все еще существуют.

Ответ 1

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

git branch -vv | grep -v origin

Это предоставит некоторую дополнительную информацию о последнем фиксации, который находится на ветке, но вы можете отфильтровать это

git branch -vv | grep -v origin | awk '{print $1}'

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

Ответ 2

git for-each-ref refs/heads --format='%(refname:short) %(upstream)' \
| awk 'NF==1'

сделает это. NF - awk "количество полей", а его действие по умолчанию - печать.

Ответ 3

Чтобы перечислить локальные ветки, отслеживающие удаленные удаленные ветки, вы можете использовать git remote prune --dry-run

Например (если ваш удаленный репозиторий называется origin):

git fetch
git remote prune origin --dry-run

Вы можете удалить параметр --dry-run, чтобы удалить ветки из локального репозитория

Ответ 4

LANG=en git branch --format='%(if:equals=gone)%(upstream:track,nobracket)%(then)%(refname:short)%(end)' | grep '.'