如何从现有存储库中的分支创建新的GitHub存储库?


170

我有masternew-project分支。现在,我想根据新项目分支与其主数据库创建一个全新的回购协议。

背景:我有一个包含三个独立应用程序的存储库。它不是以这种方式开始的。回购中原本只有一个应用程式。但是,随着时间的流逝,业务需求已发生变化。一个应用变成了两个(旧版和重写)。添加了一个Web服务。单独的分支用于包含三个项目。但是,他们不共享任何代码。因此,将它们拆分成自己的存储库会更简单。

Answers:


294

我从@ user292677的想法开始,并对其进行完善以解决我的问题:

  1. 在github中创建new-repo
  2. cd到要提取的旧存储库的本地副本,该副本被设置为跟踪将成为new-repo的主项目new-project分支。
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

新的Github存储库已完成。结果是;

  • 一个名为new-repo的新Github存储库,
  • master对应于旧仓库的new项目,具有
  • 保存所有历史记录。

实际上,我发现通过使用此方法,我可以创建带有手工选择的分支的新回购协议,并按需要重命名:

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

结果是,先前存在的site3a分支现在也移到了新的仓库中,将显示为rails3。这确实非常有效:网络图显示了具有完整历史记录且彼此之间具有正确关系的新的masterrails3

2013年12月7日更新:将此项目与另一个项目一起使用,并验证了此配方仍然有效。

更新2018-01-11:更新了步骤3.以将GitHub建议用于https协议。食谱仍然有效。


嗨@Dogweather,感谢分享。您能解释一下您的方法和更改源远程URL并推送到新的repo方法有什么区别吗?
文森特

5
Dogweather,我使用您的解决方案超过了我的记忆。谢谢!我只好先签old_branch之前,这个工作对我来说
比约恩Theart

3
请注意,这不会复制标签。我相信您可能需--follow-tags要这样做。
Factor Mystic 2015年

1
请注意,您无需在Github上创建存储库,而只需push在本地存储库上创建(例如,git init而不是Github> New> ...)
OJFord

1
我不想将所有提交历史记录转移到新的仓库中,我只想复制属于子存储库的提交。这可能吗 ??
阿巴斯·里兹维

26

更新:

cd到包含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/repoyou/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,push 的远程对象master,就完成了!

嗯!我不确定如何执行第一步:在github中克隆一个仓库。我认为不可能。
Dogweather 2012年

@Dogweather,在GitHub上称为“ forking”;为了清楚起见,我已经编辑了答案。
JC Salomon

我一直无法在一个帐户内产生一个回购。你自己尝试过吗?
Dogweather

5
  1. 在github中创建NEW_REPOSITORY。
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master:master

仅此而已。(注意:git历史记录保留)

我已经尝试了上面的答案,但发现它不够具体,因为它没有指定+ master:master,这是我使其工作所需的。效果很好。

来源(为避免github出现ssh问题,我进行了修改):Mauricio Aiello,前Java高级开发人员,https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a 在现有存储库中分支


这实际上比接受的答案更有用。即使在Git无法将src refspec错误推送到新存储库时,它也可以工作。
非正式的

2

不确定这是否是一种好方法,但是还是很简单:

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

然后在github上创建一个新的仓库,并推送它。


2

记住,当您仅创建一个新的存储库时,您将失去对旧存储库的引用,从而使维护与新存储库同步的原始项目的任何更新变得更加困难。也许分叉仓库不是更好吗?


0

除了正确答案外,几乎没有:

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

“ git@github.com:accountname / new_repo” =>从github中获取“克隆或下载”下拉菜单

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.