Small. Fast. Reliable.
Choose any three.
为什么SQLite不使用Git

1.简介

SQLite不使用 Git版本控制系统。SQLite改用 Fossil,它是专门设计和编写来支持SQLite的版本控制系统。

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

本文不是Fossil和Git之间的比较。有关 两种系统的一种比较,请参见 https://fossil-scm.org/fossil/doc/trunk/www/fossil-v-git.wiki。其他第三方比较也可以使用-使用搜索引擎找到它们。

本文并不主张您将项目从Git移开。您可以使用所需的任何版本控制系统。如果您对Git感到非常满意,那么一定要继续使用Git。但是,如果Git不能很好地为您工作,或者您想知道它是否可以改进或有更好的选择,则可以尝试理解以下介绍的观点。使用由此获得的见解来查找或编写其他更好的版本控制系统,或者仅对Git本身进行改进。

1.1。编辑

本文已被多次修订,以试图提高清晰度,解决疑虑和疑虑并修复错误。可以在https://sqlite.org/docsrc/finfo/pages/whynotgit.in中查看此文档的完整编辑历史记录 。(用法提示:单击图的任意两个节点以获取差异BTW,是否有任何Git Web界面提供类似的功能?)

2. SQLite不使用Git的一些原因

2.1。Git无法提供良好的态势感知

当我想查看SQLite发生了什么时,我访问了 时间轴,并在一个屏幕上看到了所有分支上最新更改的摘要。只需单击几下,我就可以深入挖掘所需的详细信息。我什至可以通过电话做到这一点。

GitHub和GitLab没有提供可比的东西。我发现的最接近的网络是渲染速度较慢的网络(除非已被缓存),不能提供几乎一样多的细节,并且几乎根本无法在移动设备上使用。GitHub的commits视图提供了更多细节,快速呈现并可以在移动设备上运行,但是一次只显示一个分支,所以我不容易知道我是否已看到所有最近的更改。即使GitHub / GitLab确实提供了更好的界面,但它们都是第三方服务。它们不是Git的核心部分。因此,使用它们将另一个依赖项引入到项目中。

有人告诉我,Git用户通常为Git安装第三方图形查看器,其中许多在显示项目近期活动方面做得更好。很好,但是这些仍然是更多第三方应用程序,必须分别安装和管理。许多是特定于平台的。(例如,更好的GitUp之一只能在Mac上使用。)所有这些都要求您首先同步本地存储库,然后在桌面上启动其图形界面。即使有所有这些,如果没有多次单击,我仍然看不到我通常希望看到的内容。不在办公室时,无法通过电话检查项目状态。

2.2。Git使得很难找到签到的后继者(后代)

Git让您在时间上向后看,但不向前看。有了一些历史记录,您可以看到之前发生的事情,但是查看接下来发生的事情是具有挑战性的。

相反,Fossil提供有用的显示,例如 https://sqlite.org/src/timeline?df=major-release, 以显示所有从最新主要版本派生的签入。

在Git中找到签到的后代并非不可能。这只是困难。例如,有一个 stackoverflow页面, 显示用于在unix中查找签入的后代的命令序列:

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

但这不是同一回事。上面的命令提供了一个后代列表,但未显示分支结构,这对于理解发生的事情很重要。该命令仅在您具有存储库的本地克隆的情况下才有效;使用Web界面(例如GitHub或GitLab)无法找到签到的后代。

这不只是要不时查找登机的后代。后代在化石中随时可用的事实意味着该信息遍及了化石提供的网页。一个示例:每个Fossil签入信息页面(示例)都显示该签入的直接前任和后继的小“上下文”图。这有助于用户保持更好的态势感知,并提供有用的功能,例如依次单击前进到下一个签入的功能。另一个示例:Fossil轻松显示特定签入(示例)周围的上下文,这再次有助于提高态势感知能力,并加深对代码中正在发生的事情的理解。一 整页的其他示例Fossil文档中

有了正确的扩展程序和工具以及使用正确的命令,以上所有这些在理论上都可以通过Git来实现。但这并不容易,因此很少完成。因此,开发人员对代码中正在发生的事情的了解较少。

2.3。Git的心理模型不必要地复杂

Git的复杂性分散了人们对正在开发的软件的关注。Git用户需要牢记以下所有内容:

  1. 工作目录
  2. “索引”或暂存区
  3. 当地负责人
  4. 远程头的本地副本
  5. 实际的远程头

Git具有用于在所有这些位置之间移动和比较内容的命令(和/或命令选项)。

相反,Fossil用户只需要考虑他们的工作目录和正在办理的登机手续。那就是减少60%的注意力。每个开发人员都有有限数量的大脑循环。Fossil所需的大脑周期更少,因此可以释放智力资源来专注于正在开发的软件。

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

Fossil让我放心,我已将所有内容...通过单个命令同步到服务器....我从来没有通过git放心。

2.4。Git不跟踪历史分支名称

Git会保留整个签入序列的DAG。但是,分支标记是本地信息,一旦分支关闭,该本地信息将不会同步并且不会保留。这使得对历史分支的审查变得乏味。

例如,假设有一个客户问您:“两年前那个'prefer-coroutine-sort-subquery'分支变成了什么?” 您可以尝试通过查询版本控制系统中的历史记录来回答问题,从而:

Fossil视图清楚地表明分支最终合并回了主干。它显示了分支的开始位置,并显示了两次将主干上的更改合并到分支中的情况。GitHub上没有显示任何内容。实际上,GitHub的显示在试图弄清楚发生了什么时几乎没有用。

许多读者已经为Git推荐了各种第三方GUI,它们可能在显示历史开发活动方面做得更好。也许它们中的一些确实比本机Git和/或GitHub更好地工作,尽管它们都会因Git不会在同步中保留历史分支名称的事实而受到阻碍。即使那些其他工具更好,但必须使用第三方工具来获取所需信息这一事实也不能很好地说明核心系统。

2.5。Git需要更多的管理支持

Git是复杂的软件。一个人需要某种安装程序才能将Git放在开发人员工作站上,或升级到较新版本的Git。站起来安装Git服务器并非易事,因此大多数开发人员都使用诸如GitHub或GitLab之类的第三方服务,从而引入了额外的依赖关系。

相反,Fossil是单个独立的二进制文件,可以通过将其放在$ PATH上进行安装。该二进制文件包含核心Git的所有功能,以及GitHub和/或GitLab。它通过Wiki,错误跟踪和论坛来管理社区服务器,为消费者,登录管理等提供打包下载,而无需额外的软件。为Fossil站起社区服务器仅需几分钟。化石是有效的。Fossil服务器可以在每月5美元的VPS或Raspberry Pi上正常运行,而GitLab和类似的服务器则需要更强大的硬件。

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

2.6。Git提供了糟糕的用户体验

以下https://xkcd.com/1597/卡通有点夸张,但很接近它:

让我们成为现实。很少有人会对Git提供次佳的用户体验表示怀疑。许多底层实现都显示在用户界面中。界面太糟糕了,甚至有一个模仿网站会生成 伪造的git手册页

设计软件很难。它需要重点关注。一个好的版本控制系统应该为开发人员提供帮助,而不是使他们沮丧。在过去的十年中,Git在这方面已经变得更好,但是还有很长的路要走。

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

如果您是专用的Git用户,仍然可以轻松访问SQLite。本节提供有关如何执行此操作的提示。

3.1。GitHub官方镜像

从2019年3月20日开始,GitHub上现在有了 SQLite官方的Git镜像

镜像是SQLite规范化Fossil存储库的增量导出 。一个cron-job每小时更新一次GitHub存储库。这是一个单向只读代码镜像。GitHub不接受任何请求或更改。GitHub存储库仅复制Fossil存储库中的内容。所有更改均通过Fossil输入。

在Git镜像上标识签入和文件的哈希值与Fossil中的哈希值不同。造成这种情况的原因很多,其中最主要的是Fossil使用SHA3-256哈希,而Git使用SHA1哈希。在导出过程中,每个签入的原始化石哈希值将作为页脚添加到签入注释中。为避免混淆,在引用SQLite签入时,请始终使用原始的Fossil哈希而不是Git哈希。

3.2。网络访问

SQLite的化石库中包含用于下载压缩包,ZIP档案或链接SQLite的存档SQLite的任何历史版本。这些下载的URL很简单,可以轻松地合并到自动化工具中。格式为:

https://sqlite.org/src/tarball/版本/sqlite.tar.gz

只需将VERSION替换为要下载的版本的某些说明即可。该版本可以是一个具体的办理登机手续,或分支(在这种情况下,分支的最新版本是牵强)的名称的密码散列名特定前缀或标签签入像“版本-3.23.1“:

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

要获取最新版本,请对VERSION使用“发布” ,如下所示:

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

要获取最新的后备箱登机手续,请使用VERSION的“ trunk” :

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

依此类推。对于ZIP存档和SQLite存档,只需将“ / tarball /”元素更改为“ / zip /”或“ / sqlar /”,还可以将下载文件的名称更改为“ .zip”或“。 sqlar”后缀。

3.3。化石通道

化石易于安装和使用。这是Unix的步骤。(Windows是类似的。)

  1. https://fossil-scm.org/fossil/uv/download.html下载自包含的Fossil可执行文件 ,并将该可执行文件放在$ PATH上的某个位置。
  2. mkdir〜/化石
  3. 化石克隆https://sqlite.org/src〜/ fossils / sqlite.fossil
  4. mkdir〜/ sqlite; cd〜/ sqlite
  5. 化石开放〜/化石/sqlite.fossil

此时,您已经准备好键入“ ./configure; make ”(或者在具有MSVC的Windows上,输入“ nmake / f Makefile.msc ”)。

要将您的结帐更改为其他版本的Fossil,请使用“更新”命令:

化石更新版本

版本使用“ trunk”来获取最新的SQLite中继版本。或使用加密哈希名称的前缀,或某些分支或标记的名称。有关可用于VERSION的名称的更多建议,请参见 https://fossil-scm.org/fossil/doc/trunk/www/checkin_names.wiki

在〜/ sqlite结帐中, 使用“ mosaic ui ”命令调出该网站的本地副本。

有关化石的其他文档可以在以下网址找到: https://fossil-scm.org/fossil/doc/trunk/www/permutedindex.html

不要害怕探索和实验。如果没有登录,您将无法撤回所做的任何更改,因此您不会损坏项目。

3.4。验证源代码完整性

如果您需要验证您拥有的SQLite源代码是真实的,并且没有以任何简单的命令行工具可以进行的任何方式(可能是由对手)进行修改,则可以。SQLite源代码树的根目录是一个名为“清单”的文件。清单文件包含源树中所有其他文件的名称,以及该文件的SHA1或SHA3-256哈希。(SHA1用于较旧的文件,SHA3-256用于较新的文件。)您可以编写脚本来提取这些哈希值,并对照源代码文件进行验证。签入的哈希名称只是“清单”文件本身的SHA3-256哈希。

4.另请参见

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