如何从现有回购中的分支创建新的GitHub回购?

如何从现有回购中的分支创建新的GitHub回购?,git,github,branch,Git,Github,Branch,我有硕士和新项目分支机构。现在,我想在新项目分支的基础上创建一个全新的回购协议 背景:我有一个存储库,其中包含三个独立的应用程序。事情不是这样开始的。回购协议中最初只有一个应用程序。然而,随着时间的推移,业务需求发生了变化。一个应用程序变成了两个(一个旧版本和一个重写)。添加了一个web服务。使用单独的分支来包含这三个项目。但是,它们不共享任何代码。因此,让他们分拆成自己的回购协议会更简单 git clone -b new-project /path/to/repo /new/repo/path

我有硕士新项目分支机构。现在,我想在新项目分支的基础上创建一个全新的回购协议

背景:我有一个存储库,其中包含三个独立的应用程序。事情不是这样开始的。回购协议中最初只有一个应用程序。然而,随着时间的推移,业务需求发生了变化。一个应用程序变成了两个(一个旧版本和一个重写)。添加了一个web服务。使用单独的分支来包含这三个项目。但是,它们不共享任何代码。因此,让他们分拆成自己的回购协议会更简单

git clone -b new-project /path/to/repo /new/repo/path
编辑:在GitHub中,您可以“分叉”repo,然后转到克隆中的管理选项卡。在“存储库名称”和“可见性”下面是“默认分支”,带有分支的下拉菜单。选择新项目

重新编辑:我刚刚意识到这是您想要设置的
分支,而不仅仅是“默认”分支。所以

  • 在GitHub上,将
    themes/repo
    克隆到
    you/repo
  • 运行
    git克隆git@github.com:you/repo.git
  • 启动
    gitk
  • [您可能希望创建一个
    旧主节点
    分支,这样就不会丢失旧提交的跟踪信息。]
  • 新项目
    分支上查找最近的提交,右键单击提交消息,然后选择“将主分支重置到此处”。(您也可以在命令行中使用
    git reset
    执行此操作,但我还没有找到正确的调用。)
您的下一次GitHub回购需要使用
--force
选项完成,否则就完成了

如果这是你自己的回购协议你这么做是为了

  • 运行
    git克隆git@github.com:you/orig.git
  • 运行
    git克隆原始副本
  • 如上所述,但在本地
    copy
    repo中,将
    master
    分支重置到您想要的位置
  • 创建空的GitHub项目
    you/copy
    。按照GitHub上的说明将该项目设置为本地版本的
    复制
    ,然后按
    主控
    ,就完成了
不确定这是否是一种好方法,但无论如何都很简单:

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

然后在github上创建一个新的回购协议,并推送它。

我从@user292677的想法开始,并改进它以解决我的问题:

  • 在github中创建新回购协议
  • cd到您要提取的旧回购协议的本地副本,该副本设置为跟踪将成为新回购协议主协议的新项目分支机构
  • $git-push+新项目:master
  • 新的Github回购协议已经完成。结果是

    • 新的Github存储库名为new repo
    • master
      对应于旧回购的新项目,且
    • 所有的历史都保存了下来
    事实上,我发现通过使用这种方法,我可以通过手工挑选的分支机构创建新的回购协议,并按照我的意愿重命名:

    $git推送git@github.com:accountname/new\u repo+新项目:master+site3a:rails3

    其结果是,先前存在的站点3a分支现在也被移动到新的回购协议,并将显示为rails3。这非常有效:网络图显示了新的主机rails3,具有完整的历史记录,并且它们之间的关系正确

    更新2013-12-07:将此配方用于另一个项目,并验证此配方仍然有效


    更新2018-01-11:更新步骤3。使用GitHub推荐的https协议。这个方法仍然有效。

    记住,当你简单地创建一个新的回购协议时,你就失去了对旧回购协议的引用,并且使得维护与新回购协议同步的原始项目的更新变得更加困难。或许,进行回购不是更好吗?

    更新:

    cd至本地回购协议,包含旧分支机构和:

    $ git push https://github.com/accountname/new_repo.git +old_branch:master
    
  • 在github中创建新的_存储库
  • 旧光盘库
  • git推送+主机:主机
  • 仅此而已。(注:git历史记录保留)

    我尝试了上面的答案,发现它不够具体,因为它没有指定+master:master,这是我需要使它工作的。它工作得很好


    源码(经过修改以避免github出现ssh问题):Mauricio Aiello,前Java高级开发人员,

    Hmm!我不知道如何做第一步:在github中克隆回购协议。我认为这是不可能的。@Dogweather,它在GitHub上被称为“分叉”;为了清楚起见,我编辑了我的答案。我无法在一个账户内完成回购。你自己试过吗?多格威瑟,我用过你的方法,我记不清了。谢谢我必须先签出old_branch,然后才能使用menote,它不会复制标签。我相信你可能需要
    ——跟随标签。请注意,你不需要在Github上创建repo,你只需
    推送到一个本地repo(即
    git init
    而不是Github>New>)。我不想将我所有的提交历史转移到新的repo,我只想复制属于子存储库的提交。这是否可能?要清楚,请在Git bash上使用此选项:
    Git push[repo克隆的SSH地址]+[old repo branch name]:[new repo branch name]
    。如果你复制整个回购协议,新旧回购分支机构的名称很可能是主名称。这实际上比公认的答案更有用。它甚至在Git抱怨src refspec错误而无法将旧版本推送到新的存储库的情况下也能工作。值得注意的是,这是将主版本推送到主版本,如果您想推送到特定的分支,请执行…+{old_branch_name}:{new_branch_name}