Преобразование мелкого репо в обычное репо

Я "помелил" репо:

FIRST_COMMIT="bf450342272a94117d78eae34a140a2a39359dad"
git rev-parse ${FIRST_COMMIT} > .git/shallow
git fsck --unreachable
git gc --prune=now

Теперь я пытаюсь нажать:

! [remote rejected] develop -> develop (shallow update not allowed)

Я понимаю, что это ограничение связано с тем, что репо неглубоко.

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

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

Чтобы уточнить это:

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

РЕДАКТИРОВАТЬ

Простое удаление файла .git/shallow не работает:

» git push -f --set-upstream myorigin develop
error: Could not read d18d4a247bebd32a3b57b2c0e5f9c28749083211
fatal: revision walk setup failed
error: remote unpack failed: eof before pack header was fully read
error: failed to push some refs to 'git@somehost:repos/somerepo.git'

РЕДАКТИРОВАТЬ2

Попытка отшлифовать с помощью fetch:

git fetch --unshallow

Все еще оставляет репозиторий grafted:

commit bf450342272a94117d78eae34a140a2a39359dad (grafted)
Author: The author
Date:   Thu Nov 29 16:55:05 2018 +0100

    Chages by pre-commit hook (!?)

person blueFast    schedule 16.01.2019    source источник
comment
Я полагаю, вы хотите git fetch --unshallow   -  person Owen Delahoy    schedule 16.01.2019
comment
@OwenDelahoy fetch откуда? нет пульта для извлечения. Репозиторий пока локальный. То есть я пытаюсь пушить на новый пульт, у которого нет истории и откуда я его не клонировал. Что означает fetch в этом контексте?   -  person blueFast    schedule 16.01.2019
comment
Ваша ошибка говорит [remote rejected], так что, предположительно, есть удаленное репо? Так куда ты пытаешься нажимать?   -  person Owen Delahoy    schedule 16.01.2019
comment
@OwenDelahoy, это новый пульт, на который я хочу нажать. Браться с него нет смысла?   -  person blueFast    schedule 16.01.2019
comment
@OwenDelahoy пытался получить, но безуспешно   -  person blueFast    schedule 16.01.2019
comment
Вероятно, это не рекомендуется, но вы можете заставить свою локальную историю соответствовать истории удаленного компьютера, которую вы можете использовать git reset --soft develop/master, обязательно немедленно зафиксируйте все свои файлы и отправьте все свои файлы. Если вам нужно восстановить свою историю, вы сможете снова выполнить программный сброс с помощью хэша коммита от git reflog.   -  person Owen Delahoy    schedule 16.01.2019
comment
Отвечает ли это на ваш вопрос? Как преобразовать неглубокий клон Git в полный клонировать?   -  person Hugo    schedule 07.02.2020


Ответы (2)


Из "Как преобразовать неглубокий клон Git в полный клон":

Приведенная ниже команда (git version 1.8.3) преобразует мелкий клон в обычный:

git fetch --unshallow

Затем, чтобы получить доступ ко всем веткам в ориджине (спасибо @Peter в комментариях)

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin
person Hugo    schedule 07.02.2020

Уже есть похожий (идентичный?) вопрос с очень хорошим ответ, который также решает мою проблему.

В основном мне нужно сделать следующее:

git rev-parse --verify bf450342272a94117d78eae34a140a2a39359dad > .git/info/grafts
git filter-branch -f -- --all 

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

Тогда репозиторий будет unshallowed / ungrafted, и его можно будет обычно переносить на новые удаленные устройства с уменьшенной историей.

person blueFast    schedule 16.01.2019
comment
Я прочитал ваш вопрос как вопрос о том, как очистить репо, получив недостающую историю. Метод, который вы описываете здесь, уменьшает глубину репозитория, превращая оставшуюся историю в настоящую (и единственную) историю, что создает новый и несовместимый (но не поверхностный) репозиторий. Они кардинально отличаются, так как новый репозиторий никогда не может быть использован со старыми клонами (ну, не без большой боли). - person torek; 16.01.2019
comment
@torek это есть в моем вопросе, даже выделено жирным шрифтом: меня не волнует потеря старой истории. На самом деле, я хочу забыть старую историю - person blueFast; 17.01.2019
comment
Да, но из самого вопроса мне не было ясно, что вы поняли, что для этого требуется копирование каждого коммита в новый и другой коммит с новым и другим хэш-идентификатором. Но, учитывая ваш собственный ответ и эту серию комментариев, ясно, что вы этого хотите. Я думаю, что важно указать на это другим, кто этого не хочет и может совершить ту же ошибку, что и я, читая ваш вопрос... - person torek; 17.01.2019
comment
@torek понял. уточню вопрос по этому поводу - person blueFast; 17.01.2019