bad tree object при push на Github

Помогите спасти репозиторий. При попытке отправить из VS на github локального репозитория который ведется уже 3 года. Ранее на github не отправлялся был только локально.

введите сюда описание изображения

после запроса

git reflog --all

все идет ровно но в самых первых коммитах видим введите сюда описание изображения

Что то подсказывает что так быть не должно.

Причем ошибки 3-х годичной давности введите сюда описание изображения

с

git reset --hard

все хорошо , а

git status

введите сюда описание изображения

файла ebc8e5ecfa70852aaef3ed8329ff2d75ab897a29 нету. введите сюда описание изображения Куда копать не знаю. Терять 3 года коммитов не хочется...


Ответы (1 шт):

Автор решения: Герман Борисов

Если поврежденный коммит где-то очень давно, то можно сделать клон, содержащий информацию только после него, и эту копию уже отправить на github.

Для этого есть параметр --depth указывающий сколько коммитов вглубь брать.

При клонировании локально указывается протокол file:// и путь к подпапке .git репозитория.

git clone --depth 100 "file:///path/to/repo/.git" "/path/to/repo2/"

вычитает историю на 100 коммитов.

Позднее можно увеличить глубину истории командой fetch с новой глубиной

git fetch --depth 200

Так постепенно можно увеличивать глубину, пока не дойдете до ошибки.

UPD

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

git fetch origin <hash> вытянет историю до указанного коммита включительно, а

bit branch old <hash> создаст на нем ветку old, что предотвратит удаление этих коммитов сборщиком мусора, и позволит к ним обращаться.

UPD2

Как найти хеш:

При помощи git log во втором репозитории находите последний выкачанный коммит и его хеш.

Командой git cat-file commit <hash> получаете информацию о коммите в следующем виде:

tree <hash>
parent <hash>
authot <имя> <почта> <unixtimestamp>
committer <имя> <почта> <unixtimestamp>

Сообщение коммита

parent'ов может быть несколько, если это merge или не быть, если это первый коммит в истории.

В данном случае parent'ом будет поврежденный коммит.

Переходите в изначальный репозиторий и выполняя git cat-file уже от этого коммита, записываете parent'а.

Пробуете сделать его fetch. С большой долей вероятности не сработает, так как если файл (blob) или папка (tree) не меняется, то они будут одинаковы у разных коммитов.

Повторяем git cat-file, взять paretn, пока не найдем неповрежденный коммит.

→ Ссылка