Удалить отслеживание веток больше не на удаленном - PullRequest
851 голосов
/ 11 октября 2011

Существует ли простой способ удалить все ветви отслеживания, удаленный эквивалент которых больше не существует?

Пример:

Филиалы (локальные и удаленные)

  • master
  • origin / master
  • origin / bug-fix-a
  • origin / bug-fix-b
  • origin / bug-fix-c

Локально, у меня только основная ветка.Теперь мне нужно работать над bug-fix-a , поэтому я проверяю его, работаю над ним и отправляю изменения на пульт.Затем я делаю то же самое с bug-fix-b .

Филиалы (локальные и удаленные)

  • master
  • bug-fix-a
  • bug-fix-b
  • origin / master
  • origin / bug-fix-a
  • origin / bug-fix-b
  • origin / bug-fix-c

Теперь у меня есть локальные ветви master , bug-fix-a , bug-fix-b .Главный администратор веток объединит мои изменения в master и удалит все уже объединенные ветви.

Итак, текущее состояние теперь:

Ветви (локальные и удаленные)

  • master
  • bug-fix-a
  • bug-fix-b
  • origin / master
  • origin / bug-fix-c

Теперь я хотел бы вызвать некоторую команду для удаления веток (в данном случае bug-fix-a , bug-fix-b ), которые больше не представлены в удаленном хранилище.

Это будет что-то вроде существующей команды git remote prune origin, но больше похоже на git local prune origin.

Ответы [ 26 ]

1 голос
/ 09 января 2017

Я придумал этот скрипт bash. Всегда держат ветки develop, qa, master.

git-clear() {
  git pull -a > /dev/null

  local branches=$(git branch --merged | grep -v 'develop' | grep -v 'master' | grep -v 'qa' | sed 's/^\s*//')
  branches=(${branches//;/ })

  if [ -z $branches ]; then
    echo 'No branches to delete...'
    return;
  fi

  echo $branches

  echo 'Do you want to delete these merged branches? (y/n)'
  read yn
  case $yn in
      [^Yy]* ) return;;
  esac

  echo 'Deleting...'

  git remote prune origin
  echo $branches | xargs git branch -d
  git branch -vv
}
0 голосов
/ 25 августа 2015

Я не уверен, как долго, но сейчас я использую git-up, который позаботится об этом.

Я делаю git up, и он начинает отслеживать новые ветви и удаляет старые.

Просто чтобы прояснить, это не стандартная команда git - https://github.com/aanand/git-up

Кстати, он также прячет грязное дерево и делает перебазировки с помощью всего лишь git up.

Надеюсь, это кому-нибудь пригодится

0 голосов
/ 01 июля 2016

Вот решение, которое я использую для раковины рыбы.Проверено на Mac OS X 10.11.5, fish 2.3.0 и git 2.8.3.

function git_clean_branches
  set base_branch develop

  # work from our base branch
  git checkout $base_branch

  # remove local tracking branches where the remote branch is gone
  git fetch -p

  # find all local branches that have been merged into the base branch
  # and delete any without a corresponding remote branch
  set local
  for f in (git branch --merged $base_branch | grep -v "\(master\|$base_branch\|\*\)" | awk '/\s*\w*\s*/ {print $1}')
    set local $local $f
  end

  set remote
  for f in (git branch -r | xargs basename)
    set remote $remote $f
  end

  for f in $local
    echo $remote | grep --quiet "\s$f\s"
    if [ $status -gt 0 ]
      git branch -d $f
    end
  end
end

Несколько замечаний:

Убедитесь, что установлены правильные значения base_branch.В этом случае я использую develop в качестве базовой ветви, но это может быть что угодно.

Эта часть очень важна: grep -v "\(master\|$base_branch\|\*\)".Это гарантирует, что вы не удалите master или вашу базовую ветку.

Я использую git branch -d <branch> в качестве дополнительной меры предосторожности, чтобы не удалять ветви, которые не были полностью объединены с восходящим или текущим заголовком.

Простой способ проверки состоит в замене git branch -d $f с echo "will delete $f".

Полагаю, мне следует добавить: ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК!

0 голосов
/ 07 декабря 2017

Я использую короткий метод, чтобы сделать трюк, я рекомендую вам сделать то же самое, поскольку это может сэкономить несколько часов и дать вам больше видимости

Просто добавьте следующий фрагмент в ваш .bashrc (.bashprofile наmacos).

git-cleaner() { git fetch --all --prune && git branch --merged | grep -v -E "\bmaster|preprod|dmz\b" | xargs -n 1 git branch -d ;};
  1. Выбрать все пульты
  2. Получить только объединенные ветви из git
  3. Удалить из этого списка "защищенные / важные" ветви
  4. Удалите остальные (например, чистые и объединенные ветви)

Вам нужно будет отредактировать регулярное выражение grep, чтобы оно соответствовало вашим потребностям (здесь это предотвращаетmaster, препрод и dmz от удаления)

0 голосов
/ 13 сентября 2017

Я использую этот метод, чтобы иметь больше контроля.

git branch -D $(git branch | grep -v "master" | grep -v "develop")

Это удаляет все ветви без имени: master или develop.

0 голосов
/ 07 декабря 2016

Это удалит все удаленные ветви, которых нет локально (в ruby):

bs = `git branch`.split; bs2 = `git branch -r | grep origin`.split.reject { |b| bs.include?(b.split('/')[1..-1].join('/')) }; bs2.each { |b| puts `git  push origin --delete #{b.split('/')[1..-1].join('/')}` }

Разъяснения:

# local branches
bs = `git branch`.split
# remote branches
bs2 = `git branch -r | grep origin`.split
# reject the branches that are present locally (removes origin/ in front)
bs2.reject! { |b| bs.include?(b.split('/')[1..-1].join('/')) }
# deletes the branches (removes origin/ in front)
bs2.each { |b| puts `git  push origin --delete #{b.split('/')[1..-1].join('/')}` }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...