Обратите внимание, что при использовании параметра --depth=1
предотвращает перемещение проекта в новый репозиторий.
Как клонировать seed/kick-start проект без всей истории?
Ответы (3)
Вы можете сделать
git clone <git_url>
удалите репозиторий .git из вашей папки. Что удалит всю вашу историю.
Вы можете сделать
git init
который создаст для вас совершенно новый проект git.
Это может быть не лучший способ. Но это сработает. Надеюсь, поможет.
Пока вы считаете, что полная потеря истории не является проблемой, подход, предложенный Аджаем, вполне верен. Но на случай, если вы хотите сохранить историю своего мелкого клона, у меня есть другое предложение.
Неглубокий клон делает вид, что имеет полную историю, используя так называемую точку прививки для подделать родителя «первого» коммита. Если мы предположим, что у нас есть полная история, мы могли бы перефразировать вопрос: a-git-repository">Как удалить историю до определенной версии?
Это означает, что мы можем использовать комбинацию точки прививки и git filter-branch
(как предложено в связанный вопрос). Однако вы должны отметить, что это перепишет вашу полную историю, сделав новую несовместимой с пультом, с которого мы изначально клонировали. В связи с этим мы должны удалить старый пульт из нашего репозитория.
git remote remove <old-remote-name>
Теперь мы можем приступить к нашей перезаписи. Предположим, мы хотим, чтобы текущий мастер зафиксировал новый корень для репозитория.
git rev-parse --verify master >> .git/info/grafts
git filter-branch -- --all
Это перезапишет всю историю нашего репозитория, а текущий главный коммит станет новым корнем. Вы можете завершить переписывание, удалив «резервные» ссылки в refs/original
. Кроме того, теперь вы можете удалить файл .git/shallow
.
После того, как вы это сделаете, вы сможете отправить теперь непривитую историю на новый пульт.
git rev-parse --verify master >> .git/info/grafts
я сначала проверил новую точку прививки, а затем использовал ссылку фиксации: git rev-parse --verify 9133eece0 >> .git/info/grafts
. Затем я сделал git filter-branch -- --all
. Мне не нужно было удалять файл .git/shallow
, так как он уже исчез. Не совсем понял, как удалить ссылки на резервные копии в refs/original
, и я предполагаю, что именно поэтому размер привитого репо все еще составлял 68 МБ. Однако после перехода к новому репозиторию восходящей ветки я повторно клонировал локально, и результатом стал клон 112 КБ, чего я и ожидал.
- person JinnKo; 10.07.2015
rm -rf .git/refs/original
. ;)
- person Sascha Wolf; 16.07.2015
git update-ref -d refs/original/master
(на самом деле я обычно git push . :refs/blah
потому что когда-то не знал про update-ref). См. этот ответ на Как удалить старую историю для более подробного объяснения.
- person clacke; 31.10.2015
Попробуйте что-то вроде этого:
mkdir -p /tmp/git-copy
cd /tmp/git-copy
# create another copy of your repository
git clone file:///path/to/cloned/repo
cd repo
git rebase -i (first-commit)
# in vim:
# :2,$s/^pick/squash
# :w
# Now wait, it will take a while...
git push --mirror [email protected]:username/new-repo.git
Я только что попробовал это в этом репозитории. Вроде работает - нет истории и все подмодули целы.
depth
всегда делает клон поверхностным, и это то, о чем просит OP, и мой вариант использования тоже. Для правильного ответа нужно filter-branch
, как говорит Зикер.
- person Jesús Franco; 17.01.2018
--depth=N
вместо 1? Поверхностное обновление по-прежнему отклоняется, и простое выполнениеrm -r .git
иgit init
не поможет. Я опробую всю магию непрививки, и если она работает в общем случае (глубина N), это должен быть принятый (и получивший наибольшее количество голосов;)) ответ. - person Tomasz Gandor   schedule 05.08.2019