Удалять ветки не на удаленных

==> git branch -a
* master
  test
  remotes/origin/master
  remotes/origin/test

когда кто-то удаляет remotes/origin/test, я все еще вижу его на своем компьютере.

Я знаю, что могу сделать это и удалить test

==> git remote prune
==> git branch -d test
==> git branch -a
* master
  remotes/origin/master

Но если у меня больше локальная ветвь, и они не на удаленном, так как я могу быстро их удалить?

Ответы

Ответ 1

Вот как я удаляю локальные ветки, которые больше не актуальны:

git branch --merged origin/master | xargs git branch -d

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

Ответ 2

В соответствии со справочной страницей git-fetch git fetch -p будет "После извлечения, удалите все ветки удаленного отслеживания, которые больше не существуют на удаленном компьютере". Если у вас есть локальные ветки, отслеживающие эти удаленные ветки, вам может потребоваться обрезать это вручную.

Ответ 3

Я написал для этой цели простую оболочку script, называемую git-dangling-branches. Если вы укажете опцию -D, она удалит все локальные ветки, у которых нет refs/remotes/origin/<branch_name>. Конечно, вы должны быть осторожны, когда вы это делаете.

#!/bin/bash -e
if [[ "$1" == '-D' ]]; then
  DELETE=1
else
  DELETE=0
fi

REMOTE_BRANCHES="`mktemp`"
LOCAL_BRANCHES="`mktemp`"
DANGLING_BRANCHES="`mktemp`"
git for-each-ref --format="%(refname)" refs/remotes/origin/ | \
  sed 's#^refs/remotes/origin/##' > "$REMOTE_BRANCHES"
git for-each-ref --format="%(refname)" refs/heads/ | \
  sed 's#^refs/heads/##' > "$LOCAL_BRANCHES"
grep -vxF -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES" | \
  sort -V > "$DANGLING_BRANCHES"
rm -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES"

if [[ $DELETE -ne 0 ]]; then
  cat "$DANGLING_BRANCHES" | while read -r B; do
    git branch -D "$B"
  done
else
  cat "$DANGLING_BRANCHES"
fi
rm -f "$DANGLING_BRANCHES"

Ответ 4

Другой подход:

git branch -vv | grep ' gone]' | awk '{print $1}' | xargs git branch -d

Это проверит все локальные ветки и их происхождение и удалит все локальные ветки, происхождение которых было удалено.

Подробнее:

git branch -vv

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

grep ' gone]'

отобразит ветки, соответствующие фразе "ушел".

awk '{print $1}'

будет выводить результат до первого пробела, что приведет к имени локальной ветки.

xargs git branch -d

будет использовать вывод (название ветки) и добавить его в команду "git branch -d", чтобы окончательно удалить ветвь. Если вы также хотите удалить ветки, которые не были полностью объединены, вы можете использовать капитал "D" вместо "d", чтобы принудительно удалить.

Ответ 5

Вы можете сделать это, итерации по refs, я использовал следующую команду, чтобы удалить все локальные ветки, у которых нет удаленных ветвей, и это сработало. Предупреждение: эта операция делает силовое удаление не полностью объединенных ветвей, используйте с осторожностью.

git branch -D `git for-each-ref --format="%(fieldName)" refs/heads/<branch-name-pattern>`

%(fieldName) = refname:short)

refs/heads/= может быть суффиксным, если у вас есть общий префикс/суффикс в именах ветвей ex: refs/heads/*abc*

Обратитесь к этому за дополнительной информацией git -for-each-ref (1) Страница руководства