Как мне создать новое GitHub репо из ветки в существующем репо?


171

У меня есть мастер и новые проекты филиалов. А теперь я хотел бы создать совершенно новое репо со своим мастером на основе ветки нового проекта.

Фон: у меня есть один репозиторий, который содержит три независимых приложения. Это не началось таким образом. Первоначально в репо было только одно приложение. Однако со временем потребности бизнеса изменились. Одно приложение стало двумя (устаревшая версия и переписывание). Был добавлен веб-сервис. Отдельные ветви были использованы для содержания трех проектов. Тем не менее, они не делятся ни одним кодом. И поэтому было бы проще разделить их на свои собственные репозитории.

Ответы:


294

Я начал с идеи @ user292677 и усовершенствовал ее, чтобы решить мою проблему:

  1. Создание нового репо в GitHub.
  2. Перейдите в вашу локальную копию старого репозитория, из которого вы хотите извлечь, который настроен для отслеживания ветки нового проекта , которая станет мастером нового репо .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

Новый репозиторий Github закончен. Результат есть;

  • новый репозиторий Github с именем new-repo ,
  • чей masterсоответствует новому проекту старого репо , с
  • вся история сохранилась.

Фактически, я обнаружил, что, используя этот метод, я мог создать новое репо с выбранным вручную набором веток, переименованным так, как я хотел:

$ git push git@github.com:accountname/new_repo +new-project:master +site3a:rails3

В результате существующая ветка site3a теперь также перемещена в новое хранилище и будет отображаться как rails3 . Это работает очень хорошо: схема сети показывает нового мастера и rails3 с полной историей и в их правильном отношении друг к другу.

Обновление 2013-12-07: использовал это с другим проектом и проверил, что этот рецепт все еще работает.

Обновление 2018-01-11: обновлен шаг 3. Использование рекомендации GitHub для протокола https. Рецепт все еще работает.


Привет @Dogweather, спасибо, что поделились этим. Можете ли вы объяснить, в чем заключается различие между вашим методом и изменить исходный удаленный URL, нажмите на новый метод репо?
Винсент

5
Кобель, я использовал ваше решение больше, чем помню. Спасибо! Я должен был оформить old_branch первым до этого работал для меня
Бьорн Theart

3
обратите внимание, что это не будет копировать теги. Я верю, что тебе это может понадобиться --follow-tags.
Фактор Мистик

1
Обратите внимание, что вам не нужно создавать репо на Github, вы можете просто pushсделать локальное (т.е. git initвместо Github> New> ...)
OJFord

1
Я не хочу переносить всю свою историю коммитов в новое репо, я просто хотел скопировать коммиты, которые принадлежат дочернему репозиторию. Это возможно ??
Арбаз Ризви

27

Обновить:

Перейдите в локальный репозиторий, содержащий old_branch и:

$ git push https://github.com/accountname/new_repo.git +old_branch:master

9
git clone -b new-project /path/to/repo /new/repo/path

Редактировать: В GitHub вы можете «раскошелиться» на репозиторий, а затем перейти на вкладку «Администратор» в вашем клоне. Под «именем репозитория» и «Видимостью» находится «Ветвь по умолчанию» с выпадающим меню веток. Выберите new-project.

Повторное редактирование: я только что понял, что masterвы хотите установить ветку, а не просто ветку «по умолчанию». Так…

  • На GitHub, клонировать them/repoв you/repo.
  • Бегать git clone git@github.com:you/repo.git
  • Старт gitk.
  • [Возможно, вы захотите создать old-masterветку, чтобы не потерять старые коммиты.]
  • Найдите самый последний коммит в new-projectветке, щелкните правой кнопкой мыши на сообщении коммита и выберите «Сбросить главную ветвь сюда». (Вы также можете сделать это в командной строке, используя git-reset, но я не выяснил правильный вызов.)

Следующее нажатие на репозиторий GitHub должно быть выполнено с --forceопцией, но в противном случае все готово.

Если это один из ваших собственных репозиториев, вы делаете это для…

  • Бегать git clone git@github.com:you/orig.git
  • Бегать git clone orig copy
  • Как я описал выше, но из локального copyрепозитория сбросьте masterветку туда, где вы хотите.
  • Создайте пустой проект GitHub you/copy. Следуйте инструкциям на GitHub, чтобы настроить этот проект в качестве удаленного для вашей локальной версии copy, нажмите master, и все готово!

Хм! Я не уверен, как сделать первый шаг: клонировать репо в github. Я не думаю, что это возможно.
Dogweather

@ Dogweather, это называется «разветвление» на GitHub; Я отредактировал свой ответ для ясности.
JC Salomon

Мне не удалось раскошелиться на репо в одном аккаунте. Вы сами пробовали это?
Dogweather

5
  1. Создайте NEW_REPOSITORY в github.
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: master

И это все. (Примечание: история git сохранена)

Я попробовал ответ выше и обнаружил, что он недостаточно конкретен, так как в нем не указано + master: master, и это то, что мне нужно для его работы. Работает отлично.

Источник (с моими изменениями, чтобы избежать проблем с ssh с github): Маурисио Айелло, бывший старший разработчик Java, https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a ветвп в-ан существовавшего-хранилище


Это на самом деле более удобно, чем принятый ответ. Это работает даже в ситуациях, когда Git жалуется на ошибки src refspec, когда не удается отправить старый в новый репозиторий.
Informagic

2

Не уверен, что это хороший способ, но все равно это легко:

git clone -b new-project git@github.com:User/YourProject.git newProjcet

Затем создайте новый репо на GitHub и нажмите его.


2

Помните, что когда вы просто создаете новое хранилище, вы теряете ссылку на старое и усложняете поддержание любого обновления исходного проекта, синхронизированного с новым. Возможно, не лучше ли раскошелиться на репо?


0

Небольшое дополнение к правильному ответу:

$ git push git@github.com: имя учетной записи / new_repo + old_branch: master

"git@github.com: accountname / new_repo" => получить из github выпадающее меню "Клонировать или скачать"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.