Удалять ветки не на удаленных
==> 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) Страница руководства