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, пока не найдем неповрежденный коммит.

