适合组合操作系统和专用代码的Git工作流?

适合组合操作系统和专用代码的Git工作流?,git,workflow,project,Git,Workflow,Project,我有一个基于开源框架的封闭源代码项目。我想知道我应该如何组织我的工作流程。下面是我使用git和子模块的最佳猜测 我创建了一个公共回购框架 github的子模块是 单独的吉特回购 我买了一个 github上的“微”账户(7美元),所以我 可以进行私人回购 我创建了一个私有回购协议并克隆了公共框架回购协议 从这里,我可以对以下内容进行更改: 我的私有代码并推送到github上的私有回购 公共框架代码并推送到我的私有github repo,然后从公共框架发送拉取请求。。?或者这将如何工作 如何处理包含

我有一个基于开源框架的封闭源代码项目。我想知道我应该如何组织我的工作流程。下面是我使用git和子模块的最佳猜测

  • 我创建了一个公共回购框架 github的子模块是 单独的吉特回购
  • 我买了一个 github上的“微”账户(7美元),所以我 可以进行私人回购
  • 我创建了一个私有回购协议并克隆了公共框架回购协议
  • 从这里,我可以对以下内容进行更改:

  • 我的私有代码并推送到github上的私有回购
  • 公共框架代码并推送到我的私有github repo,然后从公共框架发送拉取请求。。?或者这将如何工作
  • 如何处理包含私有代码、公共代码和子模块的回购协议。现在看来我只需要维护两个独立的代码库就可以实现这一点

    我正在寻找一个最好的答案,它可以帮助一些刚刚接触git的人简化在半开源半私有的代码库上工作的过程。它的一个好处是,每个文件夹都是私有的或公共的,因此不必担心在某个地方同时存在私有文件和公共文件,但是一些私有文件夹可能位于公共文件夹中

    我可以举的另一个例子是,使用zendframework构建您的私人公司站点,同时仍然能够每天拉入(可能还有补丁推送)zend repo。还可以在zendframework中拉和推您的私有站点

    例如,设想如下目录结构:

    /private_folder
    /public
            /public_folder
            /public_folder2
            /private_folder
    
    /repos/gatekeeper/myproject-os
    /repos/myproject-os
    /repos/myproject-priv
    

    也许我要求在一个联合回购目录中处理它们。也许没有简单的方法可以做到这一点,我应该把它们分开,把所有的公共补丁放在一个补丁里,然后把它们放到我的私人回购协议中。当然,这意味着,如果我正在处理一些私有代码——我将不得不离开该回购并打开公开的代码并使补丁代码更改,然后返回私有代码,合并,然后继续处理私有代码。

    您可以在本地存储库中有一个“公共”和“私有”分支。推送时,每个分支都会被推送到一个单独的远程存储库(请查找“gitpush”语法)。然后,您可以自由地从公共合并到私有


    我相信也有一种方法可以将选定的更改从私有合并到公共,尽管我必须查找它。

    将公共回购作为私有回购中的子模块。推的时候,记住你必须同时推两个。还记得在私有repo中检入子模块本身,以便它跟踪正在使用的子模块的修订。

    git submodules
    允许您定义一个配置(请参阅),即引用另一个组件(在另一个repo中)的一个提交

    您可以在同一个repo中开发这两个代码(您的和子模块),但当您谈论公共代码中的多个私有目录时,需要一个。
    它将允许您将目录(私有和公共目录)视为一个自然工作树。
    为了更好地管理全球回购部分向私人回购的推拉,我建议采用。

    总结一下,我建议采用以下工作流程:

  • 保持简单;每个存储库有一个工作副本(不要使用git子模块)
  • 使用您的语言工具打包您的框架
  • 设置脚本或灯光工具,使上下文切换快速或自动
  • 我以前使用过git子模块。我认为它们不适合您的用例。对我来说,最大的缺点是:

    • 当你构建(或提取)一个框架时,吃自己的狗粮是有帮助的。您是否希望您的框架用户在使用您的框架时也设置git子模块?我猜不是
    • 有可能会意外地将私有源代码发布到开源框架中
    • Git子模块在过去一年左右的时间里有了很大的改进,但它们仍然没有得到很好的理解。即使是有能力的Gitter也可能与子模块发生冲突
    我承认有一个子问题不是很明确:“哪个工作流更容易在OSS框架和私有项目之间来回切换?”

    • 使用子模块并将两个项目都放在一棵树中有一定的吸引力。这可能会加快您的文本编辑速度,但在提交和推送时可能会减慢您的速度(或导致比平时更多的错误)

    • 将项目分开有一定的吸引力。上下文切换(从一个文本编辑器窗口切换到另一个)可能有助于提醒您OSS项目是供公众使用的。例如,它可能有助于约束您不要破坏向后兼容性,并保持良好的变更日志。相对于子模块备选方案,提交和推送将很容易


    一旦你决定了你的工作副本,你就会想弄清楚你的日常工作流程。当然,这取决于你的语言。(例如,在Ruby中,您可以将OSS框架打包为一个gem,构建它,然后让您的私有代码依赖它。)无论您选择什么,都可以设置一些脚本(或者编辑器快捷方式),以帮助您快速构建库(或包),甚至在文件更改时自动构建,因此,您可以轻松地在框架和项目之间切换。

    我建议不要使用git子模块,而是使用两个不同的存储库,它们没有连接到github上

    您可以使用签出副本上的符号链接来建立它们之间的关系,这是基本而简单的。每个位置(生产、开发、同事)只需创建一次符号链接

    这样做的好处是,没有人需要付出额外的努力来学习和维护git子模块,您可以避免风险
    ln -s /repos/myproject-os/dir1 /wrk/myproject/base/dir1
    ln -s /repos/myproject-os/dir2 /wrk/myproject/base/dir2
    ln -s /repos/myproject-priv/dir1 /wrk/myproject/base/dir3
    ln -s /repos/myproject-priv/dir2 /wrk/myproject/base/someother/dir4
    mkdir /wrk/myproject/base/config
    mkdir /wrk/myproject/base/tmp
    
    /repos/gatekeeper/myproject-os
    /repos/myproject-os
    /repos/myproject-priv