Удалите старые удаленные ветки с Git

Когда я использую bash autocompletion в Git, он продолжает показывать мне ветки старых пультов, которых у меня больше нет. Когда я делаю git branch -la, он показывает те старые пульты и ветки, а git branch -l не будет. A ls .git/refs/remotes/ также показывает их. Однако они не присутствуют в моей .git/config, и они не отображаются, когда я запускаю git remote show.

Итак, как мне избавиться от них, потому что мой список автозаполнения слишком длинный прямо сейчас.

Я уже пробовал:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

Я также знаю, что я могу просто повторно клонировать репо, но это просто обманывает; -)

Ответ 1

Git не удаляет (локальные) ветки удаленного отслеживания автоматически, если ветвь удалена в удаленном репозитории. Кроме того, до того, как ветки удаленных отслеживаний V2.0.1 в некоторых случаях не были удалены, когда вы удалили удаленный файл из конфигурации git (см. Ответ VonC).

Чтобы удалить ветхие ветки удаленного отслеживания (ветки, удаленные в удаленном репозитории) для одного из ваших удаленных репозиториев, запустите

git remote prune <remote>

Чтобы привести страницу руководства или git remote:

подрезать

Удаляет все ветки ветвей отслеживания под <name> . Эти устаревшие ветки имеют уже удалены из удаленного репозитория, на который ссылается < имя > , но все еще локально доступны в "remotes/< имя > ".

С параметром --dry-run сообщите, какие ветки будут обрезаны, но сделайте на самом деле не обрезать их.

Однако из вашего вопроса кажется, что вы вручную удалили .git/refs/remotes/theoldremote, поэтому git больше не знает о удаленном репозитории, к которому относятся ветки удаленного отслеживания. Это не то, как вы должны это делать.

Обычный способ удаления удаленного репозитория - запустить

git remote rm <remote>

Это приведет к удалению удаленного из вашего .git/config и удалит ветки удаленного отслеживания.

Если вы просто удалите каталог под .git/refs/remotes/, ветки останутся позади. Затем вам нужно будет удалить их вручную:

git branch -rd <remote>/<branchname>

Вам нужна опция -r для удаления удаленной ветки.

Ответ 2

Я использую

git push origin :remote_branch

удалить ветку с сервера.

git remote prune origin

удалить удаленные ссылки, которые больше не существуют на сервере

Ответ 3

Примечание: в то время как git удаленная обрезка - это ответ, знайте, что, начиная с git 2.0.1 (25 июня 2014 года), git remote rm начинается с удаления удаленных ветвей отслеживания.
Так что, надеюсь, не следует очищать старые ветки после git remote rm.

Смотрите commit b07bdd3 Дженс Линдстрем (jensl)

remote rm: удалите удаленную конфигурацию в качестве последнего

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

Ответ 4

Ничего не удалите в ветку, чтобы удалить его:

git push remote :remote_branch

Это где-то в документах, но это не совсем очевидно.

Или я не понял ваш вопрос?

Ответ 5

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

git remote prune theremote
git remote rm theremote
git gc --prune=now

После этого они исчезнут из списка. Как-то я не удалял их правильно, прежде чем догадываться.