Неустранимая ошибка после автоматического слияния GitHub

У меня есть репозиторий на GitHub, расположенный здесь. Я создал рабочую ветку для кого-то, и они разветвили репо, внесли некоторые изменения в рабочую ветку и отправили запрос на включение.

Я попробовал внести изменения, и все было хорошо, и, поскольку GitHub предлагал автоматически объединить запрос на включение, я пошел дальше и нажал большую зеленую кнопку «Merge Pull Request». Там все было хорошо, за исключением того, что изменения рабочей ветки были применены к основной ветке, с которой я могу жить.

Проблема в том, что ни я, ни кто-либо еще не может получить репозиторий. Я получаю эту ошибку:

dp@dpub:/tmp/gh$ git clone git://github.com/dapphp/securimage.git
Initialized empty Git repository in /tmp/gh/securimage/.git/
remote: Counting objects: 333, done.
remote: Compressing objects: 100% (269/269), done.
remote: Total 333 (delta 91), reused 297 (delta 55)
Receiving objects: 100% (333/333), 3.91 MiB | 2.78 MiB/s, done.
Resolving deltas: 100% (91/91), done.
error: refs/remotes/origin/master does not point to a valid object!
error: Trying to write ref refs/heads/master with nonexistant object 31d684d383913c4cf1a0d5ff0691c2c163284a35
fatal: Cannot update the ref 'HEAD'.

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

Я обнаружил, что все еще могу клонировать удаленную ветку, используя что-то вроде этого: git clone -b audiofixes git://github.com/dapphp/securimage.git, но я все еще получаю сообщение об ошибке о плохой ссылке, и я не могу понять, какие команды я могу запустить, чтобы исправить проблему. Я готов отменить изменения, если это необходимо.

Если это поможет, как только я клонирую другую ветку, вот вывод git branch -a:

* audiofixes
  remotes/origin/2.0.2
  remotes/origin/3.0
  remotes/origin/HEAD -> origin/master
  remotes/origin/audiofixes
  remotes/origin/securimage_flash

На данный момент я действительно понятия не имею, что (если что-то) я могу сделать, чтобы исправить состояние репозитория.

Спасибо за любые предложения.

РЕДАКТИРОВАТЬ: Некоторый вывод команды по запросу.

$ ls .git/refs/remotes/origin
HEAD

$ ls .git/objects
info/  pack/
# info is empty, pack has pack-b8add06e9a6864ea44a58c06b8bd549eedd90c94.idx and pack-b8add06e9a6864ea44a58c06b8bd549eedd90c94.pack

$ cat .git/refs/remotes/origin/master
cat: .git/refs/remotes/origin/master: No such file or directory

$ cat .git/refs/remotes/origin/HEAD 
ref: refs/remotes/origin/master

person drew010    schedule 10.04.2012    source источник
comment
Это похоже на проблему, о которой вы должны связаться с GitHub.   -  person Amber    schedule 11.04.2012
comment
@Amber Вчера вечером я отправил запрос в службу поддержки, но ответа пока нет (не то чтобы я ожидал чего-то так быстро), но подумал, что попытаю счастья с любыми волшебниками Git здесь, пока я (не)терпеливо жду.   -  person drew010    schedule 11.04.2012
comment
Мне любопытно: посмотрите, сможете ли вы вставить результаты ls .git/refs/remotes/origin и cat .git/refs/remotes/origin/master и ls .git/objects   -  person Alexander Bird    schedule 11.04.2012
comment
@ Thr4wn Я пошел дальше и добавил вывод запрошенных вами команд в сообщение, спасибо.   -  person drew010    schedule 11.04.2012
comment
Теперь у вас правильный подход (попросите кого-нибудь на github исправить SHA1, связанный с идеей их репо refs/heads/master), но теперь мне любопытно, что именно пошло не так. По сути, есть две возможности: каким-то образом новые коммиты попали в репо и оставили вас с ответвлением 31d684d..., которое было записано в refs/heads/master, а затем коммит волшебным образом исчез; или фактическая новая подсказка ветки была чем-то другим, но refs/heads/master каким-то образом было написано с 31d684d.... Ни то, ни другое не должно произойти.   -  person torek    schedule 11.04.2012
comment
@torek Насколько я могу судить, все было сделано по книге. Моя единственная мысль о том, как/почему это произошло, была связана с тем, что слияние происходило из рабочей ветки в главную ветку. Я ожидал, что автоматическое слияние объединит рабочую ветку из клонированного репо с рабочей веткой основного репо, а не рабочую ветку из клонированного репо с основной веткой в ​​главном репо (если это имеет смысл). Эта часть кажется мне единственной странной во всем этом деле.   -  person drew010    schedule 12.04.2012


Ответы (1)


НОВЫЙ:

Судя по всему, 1) github не дает доступа по ssh :(, и 2) невозможно обмениваться рефлогами между разными машинами через протокол git.

Итак... Очевидно, вы уже создали тикет, но они вам не обязательно нужны для исправления репозитория. Все, что вам нужно, это чтобы они (поскольку у них есть привилегированный доступ) запускали git reflog master в репозитории сервера, а затем вставляли результаты для просмотра вами. В этом файле найдите предыдущее значение SHA-1 master (поскольку текущее не работает). Получив это, вы (я думаю) можете сделать следующее (на своем компьютере):

$ git checkout -b temp
$ git update-ref refs/heads/temp $SHA1
$ git push -u origin +temp:master

Это отменит операцию слияния на сервере.

Возможно, вы сможете получить ранее работавший SHA1 без необходимости получать reflog с сервера. В вашем локальном репозитории (или локальном репозитории вашего друга) ранее работавший коммит действительно существует где-то там. Если вы можете найти способ найти его там, вы можете продолжить предложение выше.

СТАРЫЙ: Вот моя первая мысль. Если вы сможете скопировать каталог .git/logs с сервера, тогда в нем будут сохранены все предыдущие значения ветки master. В частности, файл .git/logs/refs/heads/master будет необработанным текстовым файлом с предыдущими значениями этой ветки. Например (я не знаю, позволяет ли вам это сделать github или нет):

$ git clone https://github.com/dapphp/securimage.git -b audiofixes
$ scp github.com:/dapphp/securimage.git/logs/refs/heads/master .git/logs/refs/remotes/origin/master
$ git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1} #see "Date Spec" section of http://book.git-scm.com/4_git_treeishes.html

это должно теоретически изменить значение на то, что master было ранее. Однако он будет делать это только локально и фактически не изменит значение на сервере, что нам действительно нужно. Так что, если бы вы могли подключиться по ssh напрямую к серверу и просто запустить там последнюю команду, это (опять же, теоретически) решило бы проблему навсегда, просто отменив слияние.

.

Это все, что мне приходит в голову. Но мне очень нравится решать такие головоломки с git, поэтому я оставлю это в своей голове еще немного :)

person Alexander Bird    schedule 10.04.2012
comment
Я ценю усилия, я получаю сообщение об ошибке при попытке запустить команду scp. Мне сейчас нужно уйти с работы, и я попробую еще раз, когда вернусь домой через пару часов. Я не уверен, что происходит, но, возможно, github не разрешает scp. Invalid command: 'scp -f -- dapphp/securimage.git' You appear to be using ssh to clone a git:// URL. Точная команда была: scp [email protected]:/dapphp/securimage.git/logs/refs/heads/master .git/logs/refs/remotes/origin/master (без опции -f, как видите). - person drew010; 11.04.2012
comment
Еще раз спасибо за помощь, я как бы забыл об этом после выходных. Это была проблема с GH, по-видимому, было небольшое временное окно, когда ошибка приводила к потере некоторых объектов. Они смогли восстановить репо до состояния перед фиксацией, а затем я повторно нажал, и все было хорошо. Я ценю ваш вклад по этому вопросу! - person drew010; 17.04.2012