Как восстановить репозиторий после сбоя Github для Windows?

Github для Windows просто взорвался, когда я попытался сделать коммит, и теперь git (командная строка) сообщает мне, что каждый файл новый. У меня все еще есть папка .get размером 53 МБ. До этого я сделал от 60 до 100 коммитов.

Как я могу восстановить свою рабочую копию без потери истории или изменений?

Статус Git говорит:

На мастере ветки

Первоначальная фиксация

Изменения, которые нужно зафиксировать:
(используйте "git rm --cached ...", чтобы отменить стадию)

новый файл: .gitattributes
новый файл: .gitignore
... (еще 1620 файлов)

Изменения, не подготовленные для фиксации:
(используйте "git add ...", чтобы обновить то, что будет зафиксировано)
(используйте "git checkout -- ...", чтобы отменить изменения в рабочем каталоге)

изменено: Src/Foo/Bar/Index.cshtml

Неотслеживаемые файлы:
(используйте "git add ...", чтобы включить их в то, что будет зафиксировано)

Командная строка Posh Git выглядит так

C:\Projects\Foo [главный +1623 ~0 -0 | +0 ~1 -0]>

Вывод из git log выглядит следующим образом

C:\Projects\Foo [главный +1623 ~0 -0 | +1 ~1 -0 !]> git log
фатально: неверная версия по умолчанию 'HEAD'

ОБНОВЛЕНИЕ

Я только что запустил «Проверить базу данных» из графического интерфейса Git, и он вернулся со следующим:

оборванных дерево 4b825dc642cb6eb9a060e54bf8d69288fbee4904 оборванных коммит 30855e0deee8600f10733e6760db54fee2570a38 оборванных коммит cd8bc69ad56ca5c4d51d0d5028525698158cf3ec оборванных коммит c934f9823d907cd69c5e08a0159b9de4dfe3da35 оборванных коммит f958caca247978db978b70460276b5da7582bb06 уведомление: ГОЛОВНЫЕ указывает на неродившегося ветви (мастер) уведомление: Нет ссылок по умолчанию


person Greg B    schedule 21.10.2012    source источник
comment
Очень трудно сказать, что здесь спрашивают, без более конкретной диагностики. Возможно, вам следует включить некоторый вывод статуса git и того, что именно вы ожидаете / что было здесь раньше. А пока я проголосую за закрытие.   -  person pmr    schedule 21.10.2012


Ответы (2)


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

> dangling tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 dangling commit
> 30855e0deee8600f10733e6760db54fee2570a38 dangling commit
> cd8bc69ad56ca5c4d51d0d5028525698158cf3ec dangling commit
> c934f9823d907cd69c5e08a0159b9de4dfe3da35 dangling commit
> f958caca247978db978b70460276b5da7582bb06 notice: HEAD points to an
> unborn branch (master) notice: No default references

Отсюда я использовал

git checkout <some-hash>

Работаем с хешами висячих коммитов выше. Оказывается, последний оборванный коммит был моим самым последним коммитом, поэтому git checkout c934f9823d907cd69c5e08a0159b9de4dfe3da35 вернул меня к моей рабочей копии перед сбоем.

Отсюда я сделал git checkout -b master, который воссоздал мою основную ветку в этом коммите. git status теперь показывает одно изменение, которое я пытался сделать. Совершение этого возвращает меня в нужное русло.

person Greg B    schedule 22.10.2012
comment
@NoufalIbrahim Нет, но сначала страшно - person Greg B; 22.10.2012

Прежде всего: не паникуйте. Сделайте резервную копию вашего проекта, включая вашу рабочую папку. Хм... Вообще-то, сделайте их два :)

У меня все еще есть папка .git размером 53 МБ.

Git — довольно гибкий инструмент. Анализ базы данных объектов может «перестроить» вашу историю.

Более того, GHfW регистрирует большинство взаимодействий с репозиторием. Короче говоря, есть хорошие шансы, что команда GHfW поможет вам спасти ваш репозиторий.

Как указано в объявлении в блоге

Мы обязательно читаем каждое упоминание в Твиттере. Если вы нашли ошибку, отправьте ее на [email protected]. Каждое письмо читает реальный человек.

Отправьте им письмо. Нравится сейчас.

person nulltoken    schedule 21.10.2012
comment
Как я могу проанализировать базу данных объектов, как вы предлагаете? - person Greg B; 22.10.2012
comment
Это отдельный вопрос... и довольно сложный ;) Существуют разные виды объектов (Commit, Trees, Blobs и Tags). Каждый объект хранится (в упакованном или свободном формате) в структуре .git/objects. Дерево перечисляет своих дочерних элементов (BLOB-объекты, другие деревья или коммиты (подмодули)). Коммит указывает на дерево и список его родительских коммитов. Аннотированный тег может указывать на любой из трех других объектов. Учитывая это, нужно уметь перестраивать отношения между объектами. Содержимое .git/refs, наконец, поможет вам идентифицировать объекты с закладками (заголовки и теги). - person nulltoken; 22.10.2012