Обрезка веток гита

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

git remote prune [remoteName]

Однако это избавит только от отслеживающих ветвей, а не от локальных веток, которые вы создали дополнительно, например:

$ git branch
* master
  some-remote-branch

$ git remote prune origin
Pruning origin
URL: https://myserver.com/DefaultCollection/_git/Repo
 * [pruned] origin/some-remote-branch

$ git branch
* master
  some-remote-branch <-- non-tracking branch still here!

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

2 ответа

Решение

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

А общие способы удаления локальных ветвей без отслеживания основаны на следующих ситуациях:

Ситуация 1: в git repo есть несколько веток

Если в вашем локальном репо есть несколько веток, вы можете удалить локальные не отслеживающие ветки вручную.

Вы можете использовать команду git branch -a сравнить удаленные ветви отслеживания с локальными ветвями, а затем вручную удалить соответствующие ветви.

Ситуация 2: в git repo много веток

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

Ниже приведен пример со сценарием оболочки для автоматического удаления локальных не отслеживающих ветвей (предположим, master ветка не будет удалена):

#!/bin/sh

git fetch -p
#checkout HEAD to the branch which you will never delete, here as master won't be deleted
git checkout master

for local in $(git for-each-ref --format='%(refname:short)' refs/heads/)
do
{
  if [[ $(git branch -r) =~ $local ]]; then
    echo "local branch $local has related tracking branch"
  else
    git branch -D $local
  fi
}
done

Затем локальная не отслеживаемая ветвь будет удалена автоматически.

Кстати: кроме git remote prune [remoteName] чтобы удалить ветку отслеживания, вы также можете использовать git fetch -p удалить все ветви отслеживания.

Это невозможно в git.

Первоклассный принцип Git - избегать случайного удаления данных. Если вы нажмете на свою локальную ветку, и кто-то другой (со-сопровождающий) может удалить ее (случайно), вы потеряете всю свою работу, если запустите git remote prune cmd в следующий раз (хотя вы можете восстановить свою работу через рефлог git на короткое время - но это уже другая история).

Для местных филиалов нет автоматической очистки. Вы можете наблюдать аналогичное поведение, если объедините ветвь A в филиал B. Ветвь A все еще там - даже после того, как она устарела - и вам все равно придется удалить ее вручную (опять же - специально).

Сказав это, вы можете попробовать что-то вроде этого (пожалуйста, не слепо копируйте и вставляйте этот фрагмент в строку cmd!)

git branch --merged | xargs git branch -d 2>/dev/null

Это удалит буквально все объединенные ветви. Теперь очень важно понять, что объединение - это относительный термин. Слияние означает любой конец локальной ветви, который является дочерним элементом той ветви, из которой вы запускаете эту команду.

Если вы запустите это из своей основной ветви, вы, вероятно, получите то, что хотите - все устаревшие / объединенные ветви (с точки зрения главной ветви) будут удалены - даже ветка, которая может быть вызвана develop, Однако, если вы запускаете это из другой ветки... ну, не вините меня за удаление ранее слитых веток.

PS: ты можешь бежать git fetch -p или же git fetch --prune, Это удалит все устаревшие удаленные ветви. Если вы не хотите добавлять флаги все время, вы можете поставить

[fetch] prune = true

в ваш ~/.gitconfig

Другие вопросы по тегам