Как клонировать seed/kick-start проект без всей истории?

Обратите внимание, что при использовании параметра --depth=1 предотвращает перемещение проекта в новый репозиторий.


person itamar    schedule 20.04.2015    source источник
comment
Да, а как насчет --depth=N вместо 1? Поверхностное обновление по-прежнему отклоняется, и простое выполнение rm -r .git и git init не поможет. Я опробую всю магию непрививки, и если она работает в общем случае (глубина N), это должен быть принятый (и получивший наибольшее количество голосов;)) ответ.   -  person Tomasz Gandor    schedule 05.08.2019


Ответы (3)


Вы можете сделать

git clone <git_url>

удалите репозиторий .git из вашей папки. Что удалит всю вашу историю.

Вы можете сделать

git init 

который создаст для вас совершенно новый проект git.

Это может быть не лучший способ. Но это сработает. Надеюсь, поможет.

person Ajay    schedule 20.04.2015
comment
Скорее всего, он удалит все подмодули. - person Aleksander Alekseev; 04.01.2016
comment
@AleksanderAlekseev о каких подмодулях ты говоришь? - person Willa; 03.10.2016
comment
Если вам не нужна история, это самое простое решение. - person Willa; 03.10.2016
comment
@Willa Могу ли я по-прежнему объединять обновления в вышестоящем проекте с моим проектом, если я выберу этот маршрут? - person Felipe; 10.01.2017
comment
Я не уверен, что понимаю ваш вопрос @FelipeAlmeida. В любом случае этот способ ведения дел выглядит так, как если бы вы создали совершенно новый проект git с существующим исходным кодом. Все, что вы можете сделать с новым проектом, должно быть возможным, если вы будете следовать этому пути. - person Willa; 10.01.2017
comment
это также удалит данные других веток, тогда в это войдут только данные текущей ветки. - person suresh pareek; 15.10.2020

Пока вы считаете, что полная потеря истории не является проблемой, подход, предложенный Аджаем, вполне верен. Но на случай, если вы хотите сохранить историю своего мелкого клона, у меня есть другое предложение.


Неглубокий клон делает вид, что имеет полную историю, используя так называемую точку прививки для подделать родителя «первого» коммита. Если мы предположим, что у нас есть полная история, мы могли бы перефразировать вопрос: 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.

После того, как вы это сделаете, вы сможете отправить теперь непривитую историю на новый пульт.

person Sascha Wolf    schedule 20.04.2015
comment
Версия Git ›1.9.0 позволяет пушить из неглубокого клона. И это очень удобно, если вы хотите сохранить полную историю на сервере, но хотите только прошлогоднюю историю для другой машины. Единственное, я думаю, вам нужно иметь git › 1.9.0 как на клиенте, так и на сервере, чтобы использовать эту функцию. - person jtorca; 08.06.2015
comment
Вместо 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
comment
@JinnKo Под удалением резервных ссылок я имел в виду буквальное выполнение файла rm -rf .git/refs/original. ;) - person Sascha Wolf; 16.07.2015
comment
Рефы могут существовать в различных формах. Безопасный способ удалить ссылку, например. 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

Я только что попробовал это в этом репозитории. Вроде работает - нет истории и все подмодули целы.

person Aleksander Alekseev    schedule 04.01.2016
comment
Простое перебазирование у меня не сработало, так как использование аргумента depth всегда делает клон поверхностным, и это то, о чем просит OP, и мой вариант использования тоже. Для правильного ответа нужно filter-branch, как говорит Зикер. - person Jesús Franco; 17.01.2018
comment
` :2,$s/^pick/squash` это команда vim или текст, который мы должны добавить сверху? не могли бы вы объяснить, что это делает? - person Arnold Roa; 24.06.2018
comment
@ArnoldRoa Это команда VIM, которая заменяет весь выбор на сквош в файле VIM (начиная со 2-й строки и далее). - person user2528260; 24.01.2019