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

80

Когда я использую автозаполнение bash в Git, он продолжает показывать мне ветки старых пультов, которых у меня больше нет. Когда я делаю это, git branch -laон показывает старые пульты и ветки, а не показывает git branch -l. А 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

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

Alex
источник
Примечание. git remote rmТеперь (git 2.0.1, июнь 2014 г.) сначала удалите ветки удаленного отслеживания. Это должно помочь избежать очистки старых веток. Смотрите мой ответ ниже
VonC
Вот мой еще один ответ: stackoverflow.com/a/44129766/3835843
Ариф,

Ответы:

142

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удалить удаленную ветку.

Sleske
источник
2
Нет, не то. Это говорит fatal: 'kolichikov' does not appear to be a git repository.
Alex
2
Для автоматической обрезки удаленных веток при извлечении / извлечении см. Также: stackoverflow.com/a/18718936/968201
Патрик Джеймс Макдугл
Если вы обнаружите, что это медленное, обновите Git (2.0.1+ IIRC), где это исправлено (более чем в 100 раз быстрее).
odinho - Velmont
Примечание по сокращению пользователей: в документации Git сказано: « В большинстве случаев пользователи должны работать git gc, что вызывает git prune ». Однако обратите внимание, что git gcэто несовместимо с --dry-run.
JYL
git branch -rd <remote>/<branchname>было то, что я искал. Спасибо!
Антуан Колсон,
16

я использую

git push origin :remote_branch

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

git remote prune origin

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

Mert
источник
Нет, не то. Там написаноfatal: 'kolichikov' does not appear to be a git repository
Alex
1
Алекс, вам нужно запустить команду в папке репозитория, а не в вашей домашней папке ...
SparK
6

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

См совершить b07bdd3 по Jens Линдстрем ( jensl)

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

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


Но если вам нужно, git fetchможет быть достаточно простого , если вы сначала установили:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true
VonC
источник
См. Также github.com/git/git/commit/…
VonC
4

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

git push remote :remote_branch

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

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

арагаер
источник
2
«Это где-то в документации, но это не совсем очевидно». такой естьgit
mnagel 04
Под «удаленным» я имел в виду имя вашего удаленного репозитория. Например, "происхождение" или что-то еще. Но я начинаю думать, что вы имели в виду нечто иное, чем просто удаление удаленной ветки.
aragaer 04
Что-то еще, например: stackoverflow.com/questions/1072171/…
aragaer 04
4

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

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

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

Alex
источник
Я перепробовал все из множества источников, и единственное, что сработало, - это повторно добавить проблемный пульт, а затем удалить его. Благодаря!
jc00ke 03
0

Я запутался, когда удаленные ветки, которые были удалены на стороне сервера, все еще появлялись, когда я запускал:

$ git branch --all

Следующая команда исправила это для меня (в git версии 2.25.0):

$ git remote update --prune
htaccess
источник