Как удалить недопустимую ссылку удаленной ветки из Git?

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

$ 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

Ответ 1

Вам может понадобиться очистка

git gc --prune=now

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

git remote prune public

чернослив

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

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

Однако, похоже, они должны были быть очищены раньше с помощью

git remote rm public 

гт

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

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

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

Контекст

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

Я подозревал, что OP сделал что-то, что оставило их дерево в несогласованном состоянии, что вызвало его странное поведение, и git gc потребовалось исправить левый позади трещины.

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

Ответ 2

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

git fetch -p

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

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

git config fetch.prune true

или

git config --global fetch.prune true

Ответ 3

git push public :master

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

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

git branch -r

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

git branch -rd public/master

Ответ 4

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

$ git branch -rd origin/whatever 

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

Ответ 5

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

git remote prune public

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

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

Ответ 6

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

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

Ответ 7

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

Я нашел это решение здесь: fooobar.com/questions/12838/...

Ответ 9

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

Моя последняя идея заключалась в том, чтобы удалить все ссылки на нее вручную.

Предположим, что репозиторий называется "Repo". Я сделал:

find .git -name Repo

и удалили соответствующие файлы и каталоги

grep Repo -r .git

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

Обычно вы должны оставить это задание git.

Ответ 10

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

Ответ 11

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

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

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

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

сойка