Как удалить неверную ссылку на удаленную ветку из Git?

731

В моем текущем репо у меня есть следующий вывод:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Я хочу удалить remotes/public/masterиз списка веток:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Кроме того, вывод git remoteявляется странным, так как он не перечисляет public:

$ git remote show 
origin

Как я могу удалить 'remotes / public / master' из списка веток?

Обновление, попробовал git pushкоманду:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
cmcginty
источник
31
Сработало git remote prune [remote-name]или git fetch -p [remote-name]нет по вашему сценарию? Делать это git gcнамного эффективнее, чем обычно требуется.
rjmunro
6
git remote prune [remote-name]не будет работать с GIT SVN, хотя и не git gc... git branch -rd origin/nameхотя работает. @Casey, вам, вероятно, следует выбрать второй ответ - это немного менее опасно.
naught101
4
Мне нравится этот вопрос. Возвращаясь почти каждый месяц
oluckyman
Связанный, если не целевой объект: Удалите ветку Git как локально, так и удаленно .
2
Во избежание появления ошибки n00b в будущем я рекомендую использовать другую ветку примера, чем master... особенно при удалении с пульта.
воздержание от

Ответы:

743

Возможно, вам нужна очистка:

git gc --prune=now

или вам может понадобиться чернослив:

git remote prune public

чернослив

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

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

Тем не менее, кажется, что они должны были быть очищены ранее с

git remote rm public 

комната

Удалите пульт с именем <имя>. Все удаленные ветви отслеживания и настройки конфигурации для удаленного удаляются.

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

Может быть, запустите это снова и посмотрите, что произойдет.


Контекст консультации

Если вы посмотрите журналы ревизий , вы заметите, что я предложил более «правильные» методы, которые по какой-то причине не хотели работать с их хранилищем.

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

Обычно этого git branch -rd origin/badbranch достаточно для уничтожения локальной ветви отслеживания или git push origin :badbranchдля удаления удаленной ветви, и обычно вам никогда не потребуется звонитьgit gc

Кент Фредрик
источник
4
Я не хочу удалять ветку на удаленной стороне. Я думаю, что есть небольшая разница.
cmcginty
2
э-э, вопрос заключается в том, как «удалить удаленную ветку». Вот что это за пути.
Кент Фредрик
1
Я перефразирую тему, если это прояснит то, что я спрашиваю, но команда покажет, в чем именно заключается моя проблема.
cmcginty
40
git gcздесь не нужен, но git remote pruneзаставляет меня чувствовать себя безопаснее, чем удалять вручную git branch -rd, поскольку git проверяет, какие удаленные ветки сделаны.
Майк Сепловиц
3
это не сработало для меня - однако, 'git branch -rd' работал нормально.
dsummersl
683

Все, что вам нужно сделать, это

git fetch -p

Это удалит все ваши локальные ветви, которые удалены удаленно.

Если вы используете git 1.8.5+, вы можете установить это автоматически

git config fetch.prune true

или

git config --global fetch.prune true
Паван Махешвари
источник
7
Это то, что я тоже искал - вопрос описывает сценарий более сложный, чем обычный.
rjmunro
22
Я ищу способ удалить локальные ветви, где был удален соответствующий пульт, но у меня это не работает. Есть идеи почему?
Jackocnr
11
Это удаляет ветви, перечисленные в remote / origin, но не удаляет локальные ветви отслеживания, что не менее важно.
BlueRaja - Дэнни Пфлугхофт
@Cupcake Так как вы не откатили мое первое редактирование (которое исправляло неверную информацию о Git 1.8.5+), теперь вы сделали это неверным. Мое второе редактирование исправляло то, что я вставил, было неверно, что теперь снова там (с вашим откатом). Пожалуйста, продолжайте и откатите еще одну правку, чтобы получить оригинал. Спасибо.
ferventcoder
@ferventcoder Я дважды проверил ваше последнее редактирование и откатился на него. ОП может откатиться снова, если ему это не нравится. Спасибо.
319
git push public :master

Это приведет к удалению удаленной ветви, masterна которую указал Кент Фредрик.

Для просмотра веток удаленного отслеживания:

git branch -r

Чтобы удалить ветку удаленного отслеживания:

git branch -rd public/master
Алан Хаггай Алави
источник
6
Это помогло мне удалить удаленную ветку git-svn.
Ник
9
git branch -rd removed_remote/branchработал для меня, в то время git gc --prune=nowкак ничего не стоило.
rchampourlier
2
Я мог использовать git pruneбез каких-либо проблем, но мой коллега, который разветвлял наше основное хранилище ** ТОЛЬКО МОЖЕТ **, использует git branch -rd public/masterрешение -style, чтобы очистить его среду.
Авель
3
git branch -rd public/masterбыло то, что мне не хватало. У меня было heroku/masterи herkou/master... LOL Woops
Аарон
@rchampourlier Не на 100% бесполезно - если у вас большой репозиторий git, удаление неиспользуемых веток может освободить много дискового пространства в некоторых ситуациях.
peterh - Восстановить Монику
159

Все, что вам нужно сделать, это

$ git branch -rd origin/whatever 

Это так просто. Там нет причин для вызова здесь.

jpswain
источник
1
как вы "толкаете" это удаление в github?
Thufir
14
@Thufir Вопрос не в этом. Этот вопрос был специально для ситуаций, когда у вас есть недопустимая удаленная ссылка в локальном репозитории, но эта ветвь больше не существует на удаленном сервере. Ответ на ваш вопрос: источник git push: что угодно
jpswain,
Да, если что-то случится в удаленном репо, где удалена ветка, но у вас все еще есть ссылка на эту удаленную ветку на вашем локальном компьютере, тогда вам нужно будет сделать то, что я вставил в мой первоначальный ответ, чтобы очистить его.
jpswain
6
Если у вас большое задание по очистке (много висящих пультов), вы можете просто удалить все удаленные ветки с помощью чего-то вроде этого, а git branch -rd $(git branch -r)затем восстановить действительные, выполнив выборку.
Нобар
Моя ситуация состояла в том, что я использовал, git config -eчтобы переименовать мой пульт. Я переименовал пульт mineв origin. Тогда это было решение, которое лучше всего сработало для меня:git branch -rd $(git branch -r | grep 'mine/')
Стивен Лу
70

git gc --prune=now это не то, что вы хотите.

git remote prune public

или git remote prune origin# если это удаленный источник

это то, что вы хотите

tongueroo
источник
6
@Casey $ git gc # выполняет дефрагментацию файлов git, чтобы ускорить восстановление репозитория $ git remote prune origin #, удалит устаревшие удаленные ветви, которые отображаются с помощью "git branch -r | grep origin". Вот во что спрашивает вопрос, я верю. Итак, команды совершенно разные.
tongueroo
29

Принятый ответ не работал для меня, когда ссылка была упакована. Это делает однако:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public
Крис
источник
Работал на меня. Обычная ветка git -d не работала, возвращала ошибку, что ветка не существует, потому что я удалил источник с именем «original», созданный по ошибке, прямо в файле .git / config.
Микроб
Это метод, который мне пришлось использовать для удаления веток, которые были случайно пропущены в моем .git / config (который пришлось перестраивать из-за несвязанного повреждения). Жаль, что этот ответ был так далеко по цепочке, что я его не заметил, пока, наконец, я не нашел решение и не добавил его к принятому ответу!
Таранаки
Это то, что мне было нужно после использования svn2git. Было много удаленных / svn / * веток. Сначала нужно было создать фиктивный svn-пульт.
Сэм
7

В моем случае я пытался удалить записи, которые были сохранены в .git/packed-refs. Вы можете редактировать этот простой текстовый файл и удалять из него записи, которые git br -Dне знают, как их трогать (по крайней мере, в версии 1.7.9.5).

Я нашел это решение здесь: https://stackoverflow.com/a/11050880/1695680

ThorSummoner
источник
вау, это помогло мне Мой коллега попытался, перезагрузить VS, перезагрузить компьютер, ничего не получилось, он удалил локальное хранилище и вытащил все, чтобы избавиться от этого :)
Esen
1
Сегодня я полагал, что этот упакованный файл refs создается как часть git gc, когда он упаковывает ваши коммиты в сильно сжатый архив, он также перемещает ссылки в один простой текстовый файл, возможно, в целях оптимизации; Я надеюсь, что будущие версии Git могут git br -D ...упакованы ссылки.
ThorSummoner
3

Я не знал об этом git branch -rd, поэтому способ решения подобных проблем для меня заключается в том, чтобы относиться к своему репо как к удаленному репо и выполнять удаленное удаление. git push . :refs/remotes/public/master, Если другие способы не работают, и у вас есть какая-то странная рекомендация, от которой вы хотите избавиться, этот грубый способ верен. Это дает вам точную точность для удаления (или создания!) Любого вида ссылки.

clacke
источник
2

Только немного связанные, но все же могут быть полезны в той же ситуации, что и у нас - мы используем сетевой общий файловый ресурс для нашего удаленного хранилища. На прошлой неделе все работало, на этой неделе мы получили сообщение об ошибке: «Удаленный источник не афиширует Ref для ссылки ref / заголовки / master. Этот Ref может не существовать в удаленном или может быть скрыт настройками разрешений»

Но мы верили, что ничего не было сделано, чтобы развратить вещи. NFS делает снимки, поэтому я просмотрел каждую «предыдущую версию» и увидел, что три дня назад размер хранилища в МБ изменился с 282 МБ до 33 МБ, и теперь существует около 1403 новых файлов и 300 папок. Я обратился к своим сотрудникам, и один из них попытался сделать толчок в тот день, а затем отменил его.

Я использовал функциональность NFS «Восстановить», чтобы восстановить его до этой даты, и теперь все снова работает нормально. Я пробовал чернослив ранее, похоже, не помогло. Может быть, более жесткие очистки сработали бы.

Надеюсь, что это может помочь кому-то еще однажды!

сойка

JGlass
источник
2

У меня была аналогичная проблема. Ни один из ответов не помог. В моем случае у меня было два удаленных удаленных хранилища, которые показывались постоянно.

Моей последней идеей было удалить все ссылки на него вручную.

Допустим, хранилище называется «Репо». Я сделал:

find .git -name Repo 

Поэтому я удалил соответствующие файлы и каталоги из папки .git ( эту папку можно найти в вашем приложении Rails или на вашем компьютере https://stackoverflow.com/a/19538763/6638513 ).

Тогда я сделал:

grep Repo -r .git

Это нашло несколько текстовых файлов, в которых я удалил соответствующие строки. Теперь все вроде бы хорошо.

Обычно вы должны оставить эту работу для мерзавца.

Keinstein
источник