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

时间:2011-11-12 19:02:00

标签: git version-control

我参与的研究小组目前将所有代码托管在私有SVN存储库中。我们想打开我们的代码并将大部分代码移到Github上。问题是,一些代码是敏感的,不应该打开,但我们仍然希望它在版本控制下。目前,我们在Github上有开放代码,私有代码仍在私有SVN存储库中。有没有一种方法可以在单个Git存储库中执行此操作?

5 个答案:

答案 0 :(得分:7)

使用单个git存储库,没有。你可以做的是使用git submodules,它允许你“组合”存储库。将您的公共代码保存在github上,为您的私有代码创建另一个私有托管的git存储库,该代码将公共代码作为子模块引用。在公共子模块中进行的更改可以推送到github,并且github上的更改可以被撤回,但子模块之外的更改不会暴露给公共社区。虽然代码树将合并为一个根,但您必须在单独的模块之间独立管理提交,推送和拉取,许多人发现这些模块很麻烦且有问题,因此您应该在广泛分发之前对工作流进行一些实验。 / p>

答案 1 :(得分:0)

不。

除非您想编写git hook来加密/解密源代码,否则您将需要使用两个repos。当有人克隆一个git repo时,他们确实克隆了它,所以如果没有加密就不可能把它的一部分私有化。

答案 2 :(得分:0)

Git子模块已移至此处:http://git-scm.com/book/en/Git-Tools-Submodules

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

例如:

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

另一种选择是使用git-crypt https://www.agwa.name/projects/git-crypt/

答案 3 :(得分:0)

是的,git子模块似乎也为我们解决了这个问题。我们曾经开发过开源CMS&我们私人存储库的同一分支中的高级扩展(付费)。现在我们决定将核心开发转换为github公共回购并拆分开发。

以下是我们的目标。

  1. 使用两个分支创建公共存储库。大师去发布,开发进行实际开发。
  2. 我们为每个扩展程序创建了新的存储库
  3. 我们有一个私有存储库,其中包含我们继续开发的核心文件。将所有高级扩展添加为子模块。当然,这是私人的。分支名称 - 开发
  4. 为了合并这些变化,我们只是从我们的分支开发中挑选开发,就是这样。在这种情况下,我们为公共存储库提供了一个干净的核心相关历史记录,并且很容易克隆一个存储库,然后递归更新子模块。花了一点时间让这个同步,无论如何它是值得的。

    干杯

答案 4 :(得分:0)

这是我用于项目初始阶段的工作流程。

  1. private-master分支
  2. confidential-removed顶部的
  3. private-master分支已删除了私有内容-每件事只需要删除一次,而不是每个版本都删除
  4. public-master基于非常早的提交,没有任何私有内容
  5. version-branchpublic-master上方
  6. 一个人可以通过挑选樱桃来准备版本分支,或者通过confidential-removed来压缩合并新提交
  7. version-branchpublic-master的合并请求已经过仔细审核,以确保所有贡献都可以公开,并且差异易于阅读
  8. public-master也被推送到公共遥控器/ fork

或者,可以使用public-feature-branches代替version-branches,它们将首先在内部进行审核,然后在公共存储库中进行审核。

此工作流程的特征:

  • 公共文件和私有文件中可能存在同一文件的不同版本
  • 无需根据公开程度为不同的文件夹编写代码
  • 无需根据公开程度在多个存储库中编写代码
  • 公共分支开发人员的贡献可以合并为私人,但可能会发生一些冲突。

这是这种方法的缺点:

  • 需要专门人员的额外工作,并且
  • 也容易出错。
  • 樱桃采摘可能会揭示隐藏的依赖关系(即,采摘的代码可能使用一些未采摘的代码)。

如果项目规模庞大,参与者数量增加,那么保密性就变得尤为重要。真正应该将项目分成两部分,并以公众作为共享后端作为私有库或插件使用