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 '.'