为什么 SQLite 不使用 Git 进行版本管理?


SQLite不使用 Git 版本控制系统。SQLite使用 Fossil 作为替代,它是一个专门为支持SQLite而设计和编写的版本控制系统。

人们有时会问,为什么SQLite不像其他人那样使用 Git 版本控制系统。本文试图回答这个问题。另外,在 第3节 中,本文向Git用户提供了如何轻松访问SQLite源代码的提示。

1.1. 编辑

为了提高清晰度,明晰关注点和疑虑,并修复 Hacker News , RedditLobsters 上发现的错误,本文进行了多次修订。完整的编辑历史可以在 https://sqlite.org/docsrc/finfo/pages/whynotgit.in 中找到。

2.SQLite不使用Git的几个原因

SQLite不使用Git的原因可以用一句话概括:SQLite的主开发者发现Git令人难以接受。如果你喜欢Git而且想用它,那也没什么问题。我不喜欢Git,更喜欢用我认为更好的东西。

下面是几个我不喜欢Git的原因:

2.1. Git在check-in时很难发现后继(派生)

Git允许你可以很容易及时回退版本。如果有出分支的最后的check-in,Git可以让你看到check-in的所有的先驱。但是换个方向对Git来说很难做到。如果给出一些历史的check-in,在Git中找到下一个是什么是个相当大的挑战。这是可以完成的,但是很难而且人们很少这么做。Git的公共接口,例如GitHub,不支持这个功能。

在Git中找到一个check-in的后继,不是不可能的。只是很困难。例如,在 stackoverflow页面 有一些命令来在unix中找到一个check-in的后继:

git rev-list --all --parents | grep ".\{40\}.*.*" | awk '{print $1}'

这个命令序列对于记忆和输入来说是很重要的。(如果经常使用的话,你会想要创建一个bash别名或短shell脚本。)此外,它也不是完全一样的东西。上面的命令给出了一个后续列表,而没有显示分支结构,这对于理解所发生的事情非常重要。 相反的, Fossil提供了这个链接中的展现方式 https://sqlite.org/src/timeline?d=8a439a6dda390d74&n=15 , 这对分析历史变更的后果有很大的帮助。

实际上,这并不是仅仅为了找到签入的后续行为。 事实上,后续行为在Fossil中很容易找到,这意味着信息在 Fossil 提供的网页中无处不在。 举个例子:每一个 Fossil签入 信息页( 例子 )都有一个小的“上下文”图表,显示了直接的先导行为和签入者的后续行为。 这可以帮助用户保持更好的态势感知,并且提供了有用的功能,比如可以按顺序单击下一步的签入。 另一个例子:Fossil很容易显示特定的签入( 示例 )的上下文,这再次有助于提高态势感知和对代码中正在发生的事情做深入理解。

在Git中,所有上述都是可能的,只要有正确的扩展和工具,并使用正确的命令。但这并不容易,所以很少能做到。因此,开发人员对代码中所发生的事情的了解较少。

2.2 Git的脑力模式的是复杂的且毫无意义

Git的复杂使人从开发中的软件分心出来。Git的用户需要记住下面所有的东西:

  1. 工作目录
  2. 暂存区的“索引”
  3. 本地最新版本
  4. 远端最新版本的本地副本
  5. 实际的远端最新版本

针对移动和对比所有上述位置之间的内容,Git拥有相关命令(或者命令的选项)。

相反的,Fossil用户只需要考虑他们的工作目录和他们所工作的check-in。相对省下了60%的分心。每个开发者的脑循环都是有限数。Fossil需要更少的脑循环去做相关操作,因此它解放了脑力资源,可以将注意力放在正在开发软件上。

Git和Fossil的一个共同用户 在HN中写道

Fossil让我在完成了所有事情之后,脑子还有空间…只使用一条命令同步到服务器…。我使用git的时候脑子对这方面从来不会还有空间。

2.3. Git没有跟踪历史分支的名称

Git保持签入序列的完整有向图(DAG)。但是分支标签是本地信息,当分支关闭时,它不会被同步,也不会被保留。这使得对历史分支的回顾变得单调乏味。

作为一个例子,考虑一下由GitHub和Fossil所呈现的SQLite的单一历史分支:

从Fossil的视角可以清楚地看到,这个分支最终被合并到主干中。 它显示了分支的起始位置,它显示了 主干上的变化合并到分支的 两个场合。 GitHub没有显示这一点。事实上,在试图弄清楚到底发生了什么时,GitHub的显示基本上是无用的。

许多读者已经推荐了一些用于Git的第三方界面,以便更好地展示历史开发活动。 也许其中一些确实比原生的Git和GitHub更好,不过 它们都将 由于Git并没有在同步中保存历史分支名称 受到阻碍 。 而且即使其他工具更好,但有必要使用第三方工具来获取所需的信息,这一事实说明核心系统还不够好。

2.4. Git需要更多的管理方面的支持

Git是复杂的软件。我们需要某种安装程序将Git放在开发人员工作站上,或者升级到Git的更新版本。建立一个Git服务器是有意义的。我们可以使用GitHub,但这引入了另一个第三方依赖和一个集中式的服务,这降低了Git的“分布式”的关键优势。GitHub有各种免费的替代品,比如GitLab,但是这些替代品也有很多依赖项,需要完成大量的服务器配置。

相比之下,Fossil是一个单独的二进制文件,可通过将其放置到$PATH中来完成安装。这一个二进制包含核心Git,以及GitHub和/或GitLab的所有功能。它管理着一个社区服务器,包含wiki和错误跟踪,为用户提供包下载,登录管理等等,并且不需要额外的软件。

更少的管理意味着程序员花更多时间在软件上工作(在这种情况下是SQLite),并用更少的时间去熟悉版本控制系统。

2.5. Git提供较差的用户体验

以下 https://xkcd.com/1597/ 卡通是一种夸张的说法,但却是亲身体会:

图0:为什么 SQLite 不使用 Git 进行版本管理?

让我们回到现实吧。很少有人认为Git提供的用户体验并不理想。很多底层实现都在用户界面中中展示了。界面非常糟糕,甚至有一个模仿网站会生成假的 git man 页面。

设计软件是很难的。它需要很多的聚焦。一个好的版本控制系统应该为开发者提供帮助,而不是挫败。在过去的十年中,Git在这方面已经变得更好,但它仍然有很长的路要走。因此,SQLite的开发人员计划现在继续使用不同的版本控制系统。

3.一个访问SQLite源代码的Git用户指南

如果你是一个忠实的Git用户,你仍然可以轻松访问SQLite。 本节提供了一些关于访问源码的提示。

3.1. GitHub镜像

在GitHub的 https://github.com/mackyle/sqlite 地址上有一个SQLite源代码树的镜像。这个镜像由用户“mackyle”维护,该用户与官方SQLite开发团队没设任何关系,官方团队并不认识他。虽然我们不了解mackyle,但我们发现他在维护镜像方面做得非常出色也很受欢迎。所以,如果你想访问GitHub上的SQLite源代码,我们 推荐 他的镜像的源代码。

3.2 Web访问

SQLite Fossil Repository 包含用于下载任何历史版本Tarball,ZIP文件或SQLite文件的链接。这些下载的URL很简单,可以很容易地结合到自动化工具中。格式是:

https://sqlite.org/src/tarball/ VERSION / sqlite.tar.gz

只需要将带有说明的VERSION替换为要下载版本。这个VERSION可以是特定导入的加密哈希名称的前缀,或者一个分支的名称(在这种情况下获取分支的最新版本)或者用于特定导入的一个标签,如“version-3.23.1”:

https://sqlite.org/src/tarball/version-3.23.1/sqlite.tar.gz

要获取最新版发布版,用“release”替换VERSION,像这样:

https://sqlite.org/src/tarball/release/sqlite.tar.gz

获取最新的主分支导入,使用“trunk”替换VERSION

https://sqlite.org/src/tarball/trunk/sqlite.tar.gz

等等。对于ZIP文件,SQLite文件,只需要将 “/tarball/” 替换为”/zip/” 或者 “/sqlar/“,也可以将下载后的文件名后缀改为“.zip”或者“.sqlar。

3.3. Fossil上手

Fossil很容易安装和使用。下面是unix的步骤。(Windows相似。)

  1. 下载自包含的Fossil可执行文件https://fossil-scm.org/fossil/uv/download.html , 把可执行文件放在你的$PATH的某个地方。
  2. mkdir ~/fossils
  3. fossil clone https://sqlite.org/src ~/fossils/sqlite.fossil
  4. mkdir ~/sqlite; cd ~/sqlite
  5. fossil open ~/fossils/sqlite.fossil

现在,您可以键入“./configure;make“(或在Windows上使用MSVC,”nmake/f makefile.msc”)。

要将您的签出更改为不同版本的Fossil,使用“update”命令:

fossil update VERSION

使用“trunk”来获得最新的SQLite版本。或者使用加密散列名称的前缀,或者某个分支或标记的名称。看看这个链接https://fossil-scm.org/fossil/doc/trunk/www/checkin_names.wiki ,可以获得 哪些名称可以用于 VERSION 的更多建议。

在~/sqlite目录内使用“fossil ui”命令 来调出网站的本地副本。

关于Fossil的其他文件可以在这个链接里找到。https://fossil-scm.org/fossil/doc/trunk/www/permutedindex.html

不要害怕探索和试验。如果没有登录,你无法提交你所做的任何更改,所以你不会破坏项目的。

4. 另请参阅

其他关于Fossil和Git的页面包括:

本文文字及图片出自 OSchina

余下全文(1/3)
分享这篇文章:

请关注我们:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注