Подтвердить что ты не робот

Преобразование хранилища git в неглубоко?

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

Репозиторий git загружается через script вне моего контроля, поэтому я не могу сделать мелкий клон.

Причиной этого является сохранение дискового пространства. (Да, я действительно ограничен дисковым пространством, поэтому, хотя мелкий репозиторий не экономит много, он необходим.)

Я уже пробовал

git repack -a -d -f -depth=1

Но это фактически сделало репозиторий более крупным.

4b9b3361

Ответ 1

Скажем, самая ранняя фиксация, которую вы хотите сохранить, имеет SHA1 c0ffee.

  • Создать новую пустую ветку
  • Оформить покупку дерева самой ранней фиксации, которую вы хотите сохранить, без фактической проверки фиксации: git checkout c0ffee -- . (Теперь HEAD все еще указывает на вашу новую пустую ветку, но ваше рабочее дерево и индекс выглядят как дерево c0ffee)
  • Зафиксировать все дерево: git commit -m "Initial commit, copied from c0ffee"
  • На данный момент git diff-tree newbranch c0ffee не должен выводить результат - у них есть одно и то же дерево. (В качестве альтернативы вы можете сделать git show -s c0ffee --format=%T и git show -s newbranch --format=%T, и они должны показывать тот же хеш.)
  • git rebase --onto newbranch c0ffee master
  • git branch -d newbranch
  • git gc

Ответ 2

Вы можете преобразовать репозиторий git в неглубокий, расположенный по этой линии:

git show-ref -s HEAD > .git/shallow
git reflog expire --expire=0
git prune
git prune-packed

Обязательно создавайте резервную копию, так как это разрушительная операция, также помните, что клонирование и извлечение из мелкого репо не поддерживаются! Чтобы действительно удалить всю историю, вам также необходимо удалить все ссылки на предыдущие коммиты перед обрезкой.

Ответ 3

Это работало отлично для меня:

git pull --depth 1
git gc

Ответ 4

Решение:

git clone --depth 1 file:///full/path/to/original/dir destination

Обратите внимание, что первый "адрес" должен быть file://, что важно. Кроме того, git будет считать ваш исходный локальный файл://адресом "remote" ( "origin" ), поэтому вам нужно будет обновить новый репозиторий, указав правильный git remote.