Невозможно отправить локальную ветку на удаленный репозиторий Git - PullRequest
1 голос
/ 16 июня 2011

У меня проблема с репозиторием git, который используется несколькими разработчиками.Кажется, что ветка пропала (вроде), и когда я пытаюсь протолкнуть ее в удаленное репо с помощью этой ветки, я получаю следующее сообщение ...

To git@hades:bbis.git
 * [new branch]      dompdf0.52 -> dompdf0.52
 ! [rejected]        live -> live (non-fast-forward)
error: failed to push some refs to 'git@hades:bbis.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

В репо есть 3 ветви:

  • dompdf0.52 - это временная ветка, в которой я обновил dompdf (это нормально)
  • master
  • live (это проблемная ветка)

Я единственный разработчик, который использует ветку live (используется для развертывания на работающем сервере), и я проделал некоторую работу непосредственно в этой ветке (я знаю, что это не очень хорошая идея, но это была ошибка) и совершилна местном уровне.Я получаю эту ошибку, когда пытаюсь нажать.

Другие разработчики не видят ветку live или ветку dompdf0.5.2 (я создал оба из них, но перенес их в удаленное хранилище - они дажеотображаются в интерфейсе gitweb как HEADS).Даже когда разработчики делают git pull --all, он все равно не тянет эти ветви.

Другое странное явление заключается в том, что при просмотре журнала на gitweb он показывает только master, но при поиске шортлогов дляВетвь live показывает live в той же точке, где master входит в шортлог master.

Я просто немного озадачен тем, что здесь происходит, из того, что я вижу, ветка live находится в удаленном репо, но не отображается в основном журнале репо.

* 1030У кого-нибудь есть идеи?Дайте мне знать, если вам нужны какие-либо изображения из gitk

РЕДАКТИРОВАТЬ: Просто подумал, что я упомянул, я попытался обойти сообщение об ошибке, выполнив git fetch и git pull, но длябезрезультатно.Единственное, что я не пробовал, это git push --force, потому что я не хочу потерять свою историю.

РЕДАКТИРОВАТЬ 2: После запуска сценария, который он предоставил, я получил следующее:

fatal: ref ed2cacdacad22c75ca765cfc996304c8c7c8a654 is not a symbolic ref
fatal: ref 98c37bd8a9ef2fc16e882c17b4c04f417ae7b2b2 is not a symbolic ref

Ответы [ 2 ]

1 голос
/ 16 июня 2011

То, что вы испытываете, это просто то, что вам не разрешено толкать, потому что кто-то обновил ветку между ними.Вам нужно вытащить эту ветку, прежде чем вы сможете внести свои изменения.Причина, по которой git pull --all не работает, вероятно, заключается в том, что ваша локальная ветка live не настроена на отслеживание origin / live

Попробуйте:

git branch --set-upstream live origin/live
git checkout live
git pull
git push
1 голос
/ 16 июня 2011

Возможно, «живой» является символической ссылкой на мастера?В этом случае он действует просто как псевдоним, и его обновление (потенциально?) Обновит основную ссылку.

Символические ссылки должны быть обновлены с помощью git-update-ref.Честно говоря, я только один раз использовал символическую ссылку и никогда не передавал их на пульт.Возможно, что git push (send-pack или receive-pack) не понимает символические ссылки и пытается обработать их как нормальные ссылки, сначала разрешив символическую ссылку.

См. Что рекомендуетсяиспользование символьной ссылки Git? для фона

Основа ссылок git: http://progit.org/book/ch9-3.html

Используйте это, чтобы узнать, являются ли ваши ветви символическими ссылками:

for ref in $(git rev-list --branches --no-walk); do
    git symbolic-ref "$ref"
    git check-ref-format --print "$ref"
done

Для всех (удаленных) веток добавьте --all в список оборотов

...