【问题标题】:Split git repo in a squashed public and initial private在压缩的公共和初始私有中拆分 git repo
【发布时间】:2013-11-07 14:20:59
【问题描述】:

我想在 Github 上开源一个项目。
有很多提交(超过 2k)我会压缩成一个“初始提交”,以便从一个干净的代码库开始并隐藏一些历史内容。

问题是,是否有可能:

  • 保留一个私有仓库(上面会有一些密钥、travis conf、...)以及所有初始提交
  • 拥有干净的公共代码库(所有提交压缩为一个)
  • 并在公共仓库上工作并在需要时在私有仓库上“合并”而不会产生任何冲突?

谢谢。

【问题讨论】:

    标签: git github merge


    【解决方案1】:

    您可以在当前的 repo 中非常有效地做到这一点:

    起点:

    # ...---o---H    HEAD, master
    

    git cat-file -p master \
    | sed '1,/^$/d' \
    | git commit-tree HEAD^{tree} \
    | xargs git branch public
    

    得到

    # ...---o---H    HEAD, master
    #
    #           H'   public  <-- H's exact content and commit message, no history
    

    那么,

    git merge -s ours public
    
    # ...---o---H---I    HEAD, master   <-- gives later merges an accurate base
    #              /
    #           H''   public
    
    git remote add public -t public its://u/r/l   # <-- '-t public` sets default push
    git push public
    

    你就完成了。

    (编辑:添加了-t public安全游戏,所以你必须做一些明确的事情来推送非公开历史)

    【讨论】:

    • 有趣且相当详细,比我的回答更完整。 +1
    • 非常感谢!经过一些测试,这是我尝试过的最佳策略。
    【解决方案2】:

    有一个干净的公共代码库(所有提交压缩成一个)

    只需删除当前的 .git、git init、添加所有内容并提交:1 提交“挤压”其他所有内容。

    保留一个私人仓库

    是的,您甚至拥有像 Bitbucket 这样的托管服务,提供免费的私人存储库。

    在公共回购上工作,并在需要时在私人上“合并”,没有任何冲突

    如果您没有任何并发​​修改,则合并应该是微不足道的或快进的。
    它将在私有 repo 的本地克隆中完成,然后将其推送到其私有托管服务器。

    【讨论】:

    • 谢谢,这就是我打算做的。但是从公共回购到私人回购的拉/合并变化呢?这种行为会起作用吗?
    • @Léo 如果您的私人从与公共提交相同的提交开始是的:您可以为所有遗留提交声明一个孤立分支 (stackoverflow.com/a/19582330/6309)
    【解决方案3】:

    我建议创建一个新的公共 git 存储库并将所有相关文件复制到该新项目中(我们现在将其称为“PUBLIC”)。对 PUBLIC 进行初始提交。这为您的公共回购提供了没有历史记录的起点。

    一旦你有了这个,在未来,你想要公开的所有提交都应该提交给 PUBLIC。

    您现有的私人仓库现在可以设置一个从 PUBLIC 拉取的新遥控器。您想要进行的任何最终应在公共仓库中进行的更改都应提交给 PUBLIC,然后合并到您的私人仓库中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      相关资源
      最近更新 更多