为什么 SQLite 不使用 Git 进行版本管理?
SQLite不使用 Git 版本控制系统。SQLite使用 Fossil 作为替代,它是一个专门为支持SQLite而设计和编写的版本控制系统。
人们有时会问,为什么SQLite不像其他人那样使用 Git 版本控制系统。本文试图回答这个问题。另外,在 第3节 中,本文向Git用户提供了如何轻松访问SQLite源代码的提示。
1.1. 编辑
为了提高清晰度,明晰关注点和疑虑,并修复 Hacker News , Reddit 和 Lobsters 上发现的错误,本文进行了多次修订。完整的编辑历史可以在 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的用户需要记住下面所有的东西:
- 工作目录
- 暂存区的“索引”
- 本地最新版本
- 远端最新版本的本地副本
- 实际的远端最新版本
针对移动和对比所有上述位置之间的内容,Git拥有相关命令(或者命令的选项)。
相反的,Fossil用户只需要考虑他们的工作目录和他们所工作的check-in。相对省下了60%的分心。每个开发者的脑循环都是有限数。Fossil需要更少的脑循环去做相关操作,因此它解放了脑力资源,可以将注意力放在正在开发软件上。
Git和Fossil的一个共同用户 在HN中写道 :
Fossil让我在完成了所有事情之后,脑子还有空间…只使用一条命令同步到服务器…。我使用git的时候脑子对这方面从来不会还有空间。
2.3. Git没有跟踪历史分支的名称
Git保持签入序列的完整有向图(DAG)。但是分支标签是本地信息,当分支关闭时,它不会被同步,也不会被保留。这使得对历史分支的回顾变得单调乏味。
作为一个例子,考虑一下由GitHub和Fossil所呈现的SQLite的单一历史分支:
- GitHub: https://github.com/mackyle/sqlite/commits/prefer-coroutine-sort-subquery
- Fossil: https://sqlite.org/src/timeline?r=prefer-coroutine-sort-subquery
从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/ 卡通是一种夸张的说法,但却是亲身体会:
让我们回到现实吧。很少有人认为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相似。)
- 下载自包含的Fossil可执行文件https://fossil-scm.org/fossil/uv/download.html , 把可执行文件放在你的$PATH的某个地方。
- mkdir ~/fossils
- fossil clone https://sqlite.org/src ~/fossils/sqlite.fossil
- mkdir ~/sqlite; cd ~/sqlite
- 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
你也许感兴趣的:
- 理解 git blame:一篇简介
- 【外评】为什么 Facebook 不使用 Git
- 【外评】Git 的故事:这次没那么有趣
- 【程序员搞笑图片】最刺激的话
- BitKeeper、Linux 和许可纠纷:Linus 如何在 14 天内写出 Git
- 【程序员搞笑图片】Git 音乐播放清单
- 您应该使用的现代 Git 命令和功能
- 在版本控制方面,我们能做得比 Git 更好吗?
- Git 2.40 发布,包括 git jump 工具的更新、cat-file 工具的增强以及提高 Windows 上响应速度
- 告别SVN,Git成“独苗”:GitHub 在 13 年后宣布淘汰Subversion支持
你对本文的反应是: