单个Git存储库中的公共和私有代码

单个Git存储库中的公共和私有代码,git,version-control,Git,Version Control,我参加的一个研究小组目前将他们所有的代码托管在一个私有的SVN存储库中。我们希望打开我们的代码,并将大部分代码移到Github上。问题是,一些代码是敏感的,不应该被打开,但我们仍然希望它处于版本控制之下。目前,我们在Github上有开放代码,私有代码仍在私有SVN存储库中。在一个Git存储库中有没有一种很好的方法可以做到这一点 除非您想编写git钩子来加密/解密源代码,否则您必须使用两个repo。当有人克隆一个git repo时,他们实际上是对它的克隆,因此不可能在没有加密的情况下将它的一部分变

我参加的一个研究小组目前将他们所有的代码托管在一个私有的SVN存储库中。我们希望打开我们的代码,并将大部分代码移到Github上。问题是,一些代码是敏感的,不应该被打开,但我们仍然希望它处于版本控制之下。目前,我们在Github上有开放代码,私有代码仍在私有SVN存储库中。在一个Git存储库中有没有一种很好的方法可以做到这一点


除非您想编写git钩子来加密/解密源代码,否则您必须使用两个repo。当有人克隆一个git repo时,他们实际上是对它的克隆,因此不可能在没有加密的情况下将它的一部分变成私有的。

对于一个git存储库,不可以。你可以做的是使用它,它允许你“组合”存储库。将您的公共代码保留在github上,为您的私有代码创建另一个私有托管的git存储库,该存储库将公共代码作为子模块引用。在公共子模块内所做的更改可以向上推送到github,在github上所做的更改可以向下拉,但子模块外的更改不会向公共社区公开。虽然代码树将合并到一个根目录中,但您必须在单独的模块之间独立管理提交、推送和拉送,许多人认为这很麻烦,因此在广泛分发之前,您应该对工作流进行一些实验。

Git子模块已移至此处:

其思想是子模块是嵌入在私有git存储库中的公共git存储库。您可以单独管理它们,其优点是私有git存储库在目录结构中嵌入了publict存储库文件

例如:


另一个选择是使用git-crypt是的,git子模块似乎也为我们解决了这个问题。我们曾经在我们私有存储库的同一分支中开发开源CMS和高级扩展(付费)。现在,我们决定将核心开发转移到github公共回购,并拆分开发

我们就这样走

  • 创建具有两个分支的公共存储库。master用于发布,develop用于实际开发
  • 我们为每个扩展创建了新的存储库
  • 我们有一个包含核心文件的私有存储库,我们将在其中进行开发,并将所有高级扩展添加为子模块。当然是私人的。分支机构名称-开发
  • 为了合并更改,我们只需从我们的分支开发人员那里挑选要开发的更改,就是这样。在本例中,我们为公共存储库提供了一个干净的与核心相关的历史记录,只克隆一个存储库然后递归地更新子模块非常容易。同步这个需要更多的时间,无论如何它是值得的


    干杯

    这是我在项目初始阶段使用的工作流

  • 专用主机
    分支
  • 机密已删除
    私人主机顶部的分支已删除私人内容-每个内容只需删除一次,而不是每次发布
  • public master
    基于早期提交,没有任何私人内容
  • version分支
    位于
    public master
  • 您可以通过挑选或挤压合并
    机密删除的新提交来准备版本分支
  • 仔细审查从
    版本分支
    公共主机
    的合并请求,以确保所有贡献都可以公开,差异是人类可读的
  • public master
    也被推送到公共远程/分叉
  • 或者,可以使用
    公共功能分支
    代替
    版本分支
    ,它们将首先在内部进行审查,然后在公共存储库中进行审查

    此工作流的功能:

    • 同一文件的公共和私有版本可以不同
    • 无需根据宣传级别对不同文件夹进行编码
    • 不需要基于公开级别在多个存储库中编写代码
    • 公共部门开发者的贡献可以合并到私有部门,但可能会出现一些冲突
    以下是这种方法的缺点:

    • 需要专门的人员进行额外的工作,并且
    • 也有点容易出错
    • cherry picking可能会显示隐藏的依赖项(即,选取的代码可能会使用一些未选取的代码)
    如果项目规模越来越大,参与人数越来越多,保密性越来越重要,那么就应该将项目一分为二,将公共作为共享后端,将其作为库或私人插件使用

    /private-repository
        /some (private) directory
        /public-repository
            /some (public) directory
        /some other (private) directory