Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个具有不同历史记录的git遥控器_Git_Github - Fatal编程技术网

两个具有不同历史记录的git遥控器

两个具有不同历史记录的git遥控器,git,github,Git,Github,我们有一个内部的公司github存储库,我们希望尽快将其开源。为了安全地执行此操作,我们希望在首次推出公共回购时删除git历史记录。因此,我们需要: 创建一个公共回购,我们将其作为第二个远程回购添加到本地github回购 将本地代码的历史截断版本推送到公共回购协议 确保所有后续承诺均以本地回购和公共回购结束 例如,如果初始公共推送时的本地历史为: A -> B -> C -> D 那么,首次推出后的公开回购应该如下所示: D 添加两个新提交(E和F)后,两个回购协议应分别如

我们有一个内部的公司github存储库,我们希望尽快将其开源。为了安全地执行此操作,我们希望在首次推出公共回购时删除git历史记录。因此,我们需要:

  • 创建一个公共回购,我们将其作为第二个远程回购添加到本地github回购
  • 将本地代码的历史截断版本推送到公共回购协议
  • 确保所有后续承诺均以本地回购和公共回购结束
  • 例如,如果初始公共推送时的本地历史为:

    A -> B -> C -> D
    
    那么,首次推出后的公开回购应该如下所示:

    D
    
    添加两个新提交(E和F)后,两个回购协议应分别如下所示:

    本地:

    A -> B -> C -> D -> E -> F
    
    公众:

    D -> E -> F
    

    我们如何才能尽可能轻松地同时实现所有这些功能?我意识到有很多关于截断历史记录或拥有多个遥控器的问题/答案,但我还没有发现关于这两个功能的任何信息。

    一个解决方案是为公共回购创建初始提交,并使用
    git replace--graft
    将您的内部历史和公共历史绑定在一起。我个人认为,在类似于您在问题中所描述的情况下,此解决方案非常好。在这种情况下,历史记录如下所示:

    内部Github回购中的历史记录:

    A -> B -> C -> D -> I (replaced) -> E -> F
    
    I -> E -> F
    
    公共Github回购协议中的历史记录:

    A -> B -> C -> D -> I (replaced) -> E -> F
    
    I -> E -> F
    
    其中提交
    E
    F
    是新的发展,而
    I
    是公开回购的初始提交

    实现这一点的步骤(假设母公司是所有回购协议的主要分支机构):

    • 在声明点,您处于提交
      D
    • 将文件复制到新文件夹中,并为您的公共repo创建初始提交
      I
    • 将初始提交推送到您的(空)公共回购
    • 返回旧的本地回购并添加新的公共远程回购
    • 将初始提交从公共回购拉到新分支
    • 检查提交
      D
      I
    • 运行
      git replace--graft hash_of_commit_I hash_of_commit_D
    • 运行
      git show ref
      时,您将看到ref
      refs/replace/*
    • git日志
      将在提交时显示
      replaced
      标记
      I
    • 将新分支合并到主分支(
      I
      到主分支)
    • 将新引用推送到内部回购
      git推送到内部远程“refs/replace/*”
    • 将初始提交推送到您的内部回购
      git推送内部\u远程头:master
    • 此时,您可以删除新分支
    • 推送到公共回购不应该做任何事情,只有初始提交
      I
      ,没有以前的历史记录
    • 现在,您可以进行新的开发,并在不破坏历史的情况下推动这两个远程设备
    • git提交
    • git推送内部\u远程主机
    • git-push-public\u远程主机

      • 一种解决方案是为公共回购创建初始提交,并使用
        git replace--graft
        将内部历史和公共历史绑定在一起。我个人认为,在类似于您在问题中所描述的情况下,此解决方案非常好。在这种情况下,历史记录如下所示:

        内部Github回购中的历史记录:

        A -> B -> C -> D -> I (replaced) -> E -> F
        
        I -> E -> F
        
        公共Github回购协议中的历史记录:

        A -> B -> C -> D -> I (replaced) -> E -> F
        
        I -> E -> F
        
        其中提交
        E
        F
        是新的发展,而
        I
        是公开回购的初始提交

        实现这一点的步骤(假设母公司是所有回购协议的主要分支机构):

        • 在声明点,您处于提交
          D
        • 将文件复制到新文件夹中,并为您的公共repo创建初始提交
          I
        • 将初始提交推送到您的(空)公共回购
        • 返回旧的本地回购并添加新的公共远程回购
        • 将初始提交从公共回购拉到新分支
        • 检查提交
          D
          I
        • 运行
          git replace--graft hash_of_commit_I hash_of_commit_D
        • 运行
          git show ref
          时,您将看到ref
          refs/replace/*
        • git日志
          将在提交时显示
          replaced
          标记
          I
        • 将新分支合并到主分支(
          I
          到主分支)
        • 将新引用推送到内部回购
          git推送到内部远程“refs/replace/*”
        • 将初始提交推送到您的内部回购
          git推送内部\u远程头:master
        • 此时,您可以删除新分支
        • 推送到公共回购不应该做任何事情,只有初始提交
          I
          ,没有以前的历史记录
        • 现在,您可以进行新的开发,并在不破坏历史的情况下推动这两个远程设备
        • git提交
        • git推送内部\u远程主机
        • git-push-public\u远程主机

        如果计划是让内部和外部回购协议的所有未来修订保持同步,那么就省去一大堆麻烦,只需将历史清理版本变成“一个真相”,并在内部使用。保留旧版本以用于存档,但继续使用新版本。其他一切都将是丑陋的地狱,因为git永远不会将这两份回购协议的“相同”承诺视为以任何方式、形状或形式相关。如果你必须这样做,你会希望某种自动合并发生在公共回购中。@JoachimSauer合并不是一个好主意,因为那样会把私人历史带回到公共历史中。你需要在公共D上选择E和F,我称之为D。你最终会得到d'->E'->F'。我