我认为您对此有点模糊,因为您似乎正在尝试将版本控制处理事物的方式与公开 API 的方式(即 Web 服务器如何处理事物)结合起来。
为了使 API 的多个版本同时工作,消费者可能需要指定他们想要用于给定调用的版本。出于此答案的目的,我假设您正在以与 Stack Exchange API 类似的方式工作,因此该版本被指定为 API URL 的第一个“目录”组件(例如,对于 1.5 版,我将我的请求定向到http://domain.tld/1.5/call
,我使用的版本 1.6http://domain/1.6/?method=call
等)。但实际上,这个元素并不重要,只要您有某种机制来确定适当的版本并将请求路由到 Web 服务器级别的正确控制器即可。
版本控制
我在这里采用的方法相当简单。每个版本在存储库中都有自己的分支。针对该版本执行的任何开发工作要么在版本分支的分支中完成,要么直接提交给该版本。Master 始终包含最新的稳定版本。
例如,假设当前版本是 1.5,并且当前所有内容都在 master 之下,并且您没有历史分支。在当前稳定代码下画一条线,并创建一个名为 1.5 的分支。现在,要在 1.6 上开始开发,它将在 1.5 分支上构建,从 master 创建一个新分支并将其命名为 1.6。
任何针对 1.6 的开发都发生在 1.6 分支中,或者使用 1.6 作为基础创建的其他分支。这意味着一切都可以很好,并且可以根据需要干净地推/拉到 1.6 分支中。
如果您需要在 1.5 版本中应用小错误修复,您可以在 1.5 分支中轻松完成此操作。如果您想从 1.6 分支中提取提交,则需要“挑选”它 - 由于分支已经开始分歧,任何此类问题都需要手动处理,以确保最大程度地安全保护“稳定“代码库。
当需要创建 1.7/2.0/whatever 时,将 1.6 版本拉入 master,标记它,并为新版本创建一个新分支。
以这种方式,每个版本/发布的谁做了什么以及什么时候做了什么的完整历史被存储在分支中。正如其他人所提到的,不要忘记标记您的里程碑版本。
网络服务器
使用上述方法,Web 服务器设置维护起来相当简单。每个版本的根目录都简单地与适当的分支同步。
因此,为了简单起见,我们假设版本控制中存储库的根目录对应于 API 代码的文档根目录(实际上这不太可能,但稍微重写一下 URL 或类似的方法可以解决这个)。
在 Web 服务器上域的文档根目录中,我们创建以下目录结构:
<文档根>
|
|--- 1.5
|
|--- 1.6
我们从中央版本控制克隆存储库到每个 1.5、1.6 目录,然后切换到适当的分支。每次您希望实时推送更改时,只需从相应分支的版本控制中下拉更改即可。
在大容量环境中,您可能有一个专用于为每个版本提供服务的完整服务器,其中版本标识符作为子域,但同样的一般原则适用 - 除了存储库可以直接克隆到每个服务器的文档根目录中。
很多(如果不是全部)为新分支创建目录、将 repo 克隆到其中并切换到适当的分支以及为发布拉下补丁/错误修复的过程可以使用脚本/cron 等自动化,但是在你这样做之前不要忘记:在没有人工参与的情况下将更改推送到实时服务器通常会以泪水告终。
另一种方法
...将创建一个单独的父存储库,作为域的文档根。在此,您将在存储库的根目录中为每个版本创建子模块。这将产生的总体效果将非常相似,但具有只需要在服务器上同步单个存储库的“优势”,并保持由版本控制定义的 Web 服务器的目录结构。但是,就个人而言,我不喜欢这种方法,原因有两个:
- 子模块很难维护。它们附加到特定的提交,很容易忘记这一点。
- 我相信分支驱动方法提供的控制更加精细,并且更清楚地知道到底发生了什么。
我承认这两个原因在很大程度上都是个人喜好,这就是为什么我提出它作为一种可能性。