Преобразование хранилища git в неглубоко?
Как я могу конвертировать уже клонированный репозиторий git в неглубокий репозиторий?
Репозиторий git загружается через script вне моего контроля, поэтому я не могу сделать мелкий клон.
Причиной этого является сохранение дискового пространства. (Да, я действительно ограничен дисковым пространством, поэтому, хотя мелкий репозиторий не экономит много, он необходим.)
Я уже пробовал
git repack -a -d -f -depth=1
Но это фактически сделало репозиторий более крупным.
Ответы
Ответ 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
.