SQLite旨在满足大多数开发人员的需求,无需任何更改或自定义。当需要更改时,通常可以使用启动时(1)或运行时(2) (3) (4)配置方法,或通过编译时选项来实现。应用程序开发人员很少需要编辑SQLite源代码才能将SQLite集成到产品中。
我们将为单个应用程序使用的SQLite源代码的自定义修改称为“私有分支”。当私有分支变得必要时,应用程序开发人员必须承担将私有分支与公共SQLite源代码保持同步的任务。这很繁琐。这也很棘手,因为虽然SQLite文件格式和发布的接口非常稳定,但SQLite的内部实现变化非常快。对于任何给定的SQLite点版本,可能有数百或数千行代码发生变化。
本文概述了一种将SQLite私有分支与公共SQLite源代码保持同步的可能方法。当然,维护私有分支的方法有很多。没有人被迫使用本文中描述的方法。本文并非试图强加特定程序给私有分支的维护者。本文的目的是提供一个维护私有分支的流程示例,该流程可以用作设计最适合每个项目情况的流程的模板。
我们建议使用Fossil软件配置管理系统来设置两个分支。一个分支(“公共分支”或“主干”)包含已发布的SQLite源代码,另一个分支是包含为项目定制的代码的私有分支。每当发布新的公共SQLite版本时,该版本都会添加到公共分支中,然后将更改合并到私有分支中。
本文档建议使用Fossil,但任何其他分布式软件配置管理系统,如Monotone或Mercurial(也称为“hg”),或Git都可以同样适用。概念将相同,但过程的细节会有所不同。
右侧的图表说明了这个概念。从标准的SQLite版本开始。例如,假设打算从SQLite 3.6.15版本创建私有分支。在图中,这是版本(1)。维护者将基线SQLite的精确副本复制到分支空间,显示为版本(2)。请注意,(1)和(2)完全相同。然后,维护者将私有更改应用于版本(2),得到版本(3)。换句话说,版本(3)是SQLite 3.6.15加上编辑后的版本。
稍后,发布了SQLite 3.6.16版本,如图表中的圆圈(4)所示。此时,私有分支维护者执行合并操作,将从(1)到(4)的所有更改应用于(3)。结果是版本(5),它是SQLite 3.6.16加上编辑后的版本。
可能会发生合并冲突。换句话说,从(2)到(3)的更改可能与从(1)到(4)的更改不兼容。在这种情况下,维护者必须手动解决冲突。希望冲突不会经常出现。当私有编辑保持最小时,冲突发生的可能性较小。
上述循环可以重复多次。该图显示了第三个SQLite版本,即圆圈(6)中的3.6.17。私有分支维护者可以执行另一个合并操作,以将从(4)到(6)的更改合并到私有分支中,从而得到版本(7)。
本文档的其余部分将指导读者完成维护私有分支所需的步骤。总体思路与上面概述的相同。本节仅提供更多细节。
我们再次强调,这些步骤并非维护私有分支的唯一可接受方法。这只是众多方法之一。使用本文档作为准备项目特定程序的基线。不要害怕尝试。
Fossil是一个必须安装在您机器上的计算机程序,才能使用它。幸运的是,安装Fossil非常简单。Fossil是一个简单的“*.exe”文件,您只需下载并运行即可。要卸载Fossil,只需删除exe文件即可。详细说明有关安装和开始使用Fossil的信息可在Fossil网站上找到。
使用以下命令创建一个Fossil仓库来托管私有分支
fossil new private-project.fossil
您可以随意命名您的项目。".fossil"后缀是可选的。在本说明文档中,我们将继续将项目称为"private-project.fossil"。请注意,private-project.fossil是一个普通的磁盘文件(实际上是一个SQLite数据库),其中将包含您的完整项目历史记录。您可以简单地复制该文件来备份项目。
如果您想配置新项目,请键入
fossil ui private-project.fossil
"ui"命令将导致Fossil运行一个微型内置Web服务器,并启动您的Web浏览器指向该Web服务器。您可以使用您的Web浏览器以各种方式配置您的项目。有关更多信息,请参阅Fossil网站上的说明。
创建项目仓库后,通过移动到要保存所有项目源代码的目录并键入以下命令来创建项目的开放检出
fossil open private-project.fossil
如果您愿意,可以拥有同一项目的多个检出。您还可以将仓库“克隆”到不同的机器,以便多个开发人员可以使用它。有关更多信息,请参阅Fossil网站。
上一步创建的仓库最初是空的。下一步是加载基线SQLite版本 - 上图中的圆圈(1)。
首先,以您使用的任何形式获取SQLite的副本。您获得的公共SQLite应尽可能接近您的私有编辑副本。如果您的项目使用SQLite合并版本,则获取合并版本的副本。如果您使用预处理的分离源文件,则获取这些文件。将所有源文件放在上一步创建的检出目录中。
公共SQLite版本中的源代码使用Unix行尾(ASCII码10:“换行”仅,NL)和空格而不是制表符。如果您将行尾更改为Windows样式行尾(ASCII码13、10:“回车”和“换行”;CR-NL),或者如果您将空格缩进更改为制表符缩进,则**请立即进行此更改**,然后再检入基线。合并过程仅在公共分支和私有分支之间的差异最小时才能正常工作。如果由于您将行尾从NL更改为CR-NL,导致源文件的每一行都发生了更改,则合并步骤将无法正确工作。
假设您使用的是合并源代码。将基线添加到您的项目中,如下所示
fossil add sqlite3.c sqlite3.h
如果您使用的是分离源文件,则命名所有源文件,而不仅仅是两个合并源文件。完成后,按如下所示提交更改
fossil commit
系统将提示您输入检入注释。您可以随意输入。提交完成后,您的基线将成为仓库的一部分。如果您愿意,可以使用以下命令在“时间线”上查看此内容
fossil ui
最后一个命令与我们之前运行的“ui”命令相同。它启动一个正在运行的微型Web服务器,并将您的Web浏览器指向它。但是这次我们不必指定仓库文件,因为我们位于检出目录内,因此Fossil可以自行确定仓库。如果您想将仓库文件名作为第二个参数键入,则可以。但它是可选的。
如果您不想使用Web浏览器查看新的检入,则可以使用以下命令从命令行获取一些信息
fossil timeline fossil info fossil status
上一步创建了上图中的圆圈(1)。此步骤将创建圆圈(2)。运行以下命令
fossil branch new private trunk -bgcolor "#add8e8"
此命令将创建一个名为“private”(您可以使用其他名称)的新分支,并为其分配浅蓝色(“#add8e8”)的背景颜色。您可以省略背景颜色,尽管具有不同的背景确实可以更容易地在时间线显示中区分分支和“主干”(公共分支)。您可以使用Web界面更改私有分支或公共分支(“主干”)的背景颜色。
以上命令创建了新分支。但是您的检出仍然位于主干上 - 您可以通过运行以下命令查看此事实
fossil info
要将检出更改为私有分支,请键入
fossil update private
您可以再次运行“info”命令以验证您是否位于私有分支上。要返回公共分支,请键入
fossil update trunk
通常,Fossil在私有分支和公共分支之间切换时会修改检出中的所有文件。但在这一点上,这两个分支中的文件是相同的,因此无需进行任何修改。
现在是时候对SQLite进行私有、自定义修改了,这是本练习的全部目的。使用“"fossil update private"命令切换到私有分支(如果您尚未切换),然后在文本编辑器中打开源文件并进行任何所需的更改。完成更改后,使用以下命令提交这些更改
fossil commit
系统将再次提示您输入描述更改的提交信息。然后将发生提交。提交将在仓库中创建一个新的检入,对应于上图中的圆圈(3)。
现在公共分支和私有分支不同了,您可以运行“"fossil update trunk"和"fossil update private"命令,并查看Fossil确实在您在分支之间来回切换时更改了检出中的文件。
请注意,在上图中,我们将私有编辑显示为一个提交。这仅仅是为了演示清晰起见。没有什么可以阻止您进行数十或数百次单独的小改动,并分别提交它们。事实上,进行许多小的改动是首选的工作方式。将所有更改都放在一个提交中的唯一原因是它使图表更容易绘制。
假设一段时间后(通常大约一个月),SQLite 发布了新版本:3.6.16。您需要将这个新的公共 SQLite 版本整合到您在公共分支(主干)中的存储库中。为此,首先将您的存储库切换到主干
fossil update trunk
然后下载新版本的 SQLite 源代码,并覆盖检出中已有的文件。
如果您在原始基线上进行了 NL 到 CR-NL 行结束符的更改或空格到制表符缩进的更改,请对新的源文件进行相同的更改。
一切准备就绪后,运行“fossil commit” 命令来检入更改。这在上面的图中创建了圆圈 (4)。
下一步是将公共分支中的更改移动到私有分支。换句话说,我们希望在上面的图中创建圆圈 (5)。首先使用“fossil update private” 切换到私有分支。然后键入此命令
fossil merge trunk
“merge” 命令尝试将圆圈 (1) 和 (4) 之间的所有更改应用到本地检出的文件中。请注意,圆圈 (5) 尚未创建。您需要运行“commit”来创建圆圈 (5)。
合并过程中可能会出现冲突。当圆圈 (1) 和 (4) 与圆圈 (2) 和 (3) 之间以不同的方式更改了同一行代码时,就会发生冲突。“merge” 命令会宣布任何冲突,并在输出中包含冲突行的两个版本。您需要打开包含冲突的文件并手动解决冲突。
解决冲突后,许多用户喜欢在将新版本提交到存储库之前进行编译和测试。或者您可以先提交,然后再测试。无论哪种方式,请运行“fossil commit” 命令来检入圆圈 (5) 版本。
随着 SQLite 新版本的发布,重复步骤 3.6 和 3.7 将新版本中的更改添加到私有分支。如果需要,可以在版本之间对私有分支进行其他私有更改。
自从本文档首次编写以来,规范的 SQLite 源代码已从久负盛名的 CVS 系统迁移到位于 https://www.sqlite.org/src 的 Fossil 存储库中。这意味着,如果您使用的是规范的 SQLite 源代码(而不是 合并 源代码文件 sqlite3.c 和 sqlite3.h),那么您可以通过克隆官方存储库来轻松创建私有存储库
fossil clone https://www.sqlite.org/src private-project.fossil
此命令既创建了新的存储库,又用所有最新的 SQLite 代码填充了它。然后,您可以按照第 3.4 节中所述创建私有分支。
当通过克隆创建私有存储库时,整合新的公共 SQLite 版本也变得更加容易。要从公共 SQLite 存储库中提取所有最新更改,只需进入打开的检出并执行
fossil update
然后继续按照第 3.7 节中所述将“trunk”中的更改与您的“private”更改合并。
此页面上次修改于 2023-10-10 17:29:48 UTC