portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got
https://qiita.com/nanorkyo/items/f7d2d796b8303eb656f2
最后更新于 2023-12-02 发布于 2023-12-02
开始
介绍了一个名为 Got 的由OpenBSD项目衍生出来的 Git 替代品。虽然它是一个 git 命令的替代品,但对于那些对 git 命令的使用没有疑问,并且对其许可证没有疑问的人来说,这是一个完全不必要的工具。由于开发者是开发者,因此其用途非常独特。
据说它的目标是支持 Git 的裸仓库兼容^ 1^。对于裸仓库的操作是兼容的。但是在所谓的工作目录(包括索引)级别上不兼容。因此,需要根据工作流程切换命令。
既然开始写一个泛论的介绍,最近的 FreeBSD 中删除了 portsnap 命令,看到使用 Git 的建议^ 2^,对于那些希望使用 portsnap 而不是 git 的人来说,可能有点不情愿……
由于 Got 专注于实现 OpenBSD 开发的工作流程,因此其代码量非常少,几乎没有依赖。它被宣称为轻量级、紧凑且不会造成头痛的工具。然而,关于其轻便性能的评价,我就不发表评论了。另外,由于要求独特的使用体验,我认为在需要严格使用 Git 的情况下最好不要使用它。
以下用例将描述目标作为 portsnap 的替代。
尝试安装
这周围也没有变化。由于没有依赖项,因此不会安装其他软件包。
通过 GOT 的版本验证为 0.93 。由于版本升级,此处记录的内容可能不再适用。
首先尝试克隆
got clone 和 git clone 之间的区别如下。
仅克隆裸库(相当于 git clone --bare )
克隆案例
复制 $ git clone https://git.freebsd.org/ports.git /usr/ports
与上述命令相对应的是 got 命令,具体如下。首先需要展开裸存储库的区域。由于这个过程非常耗时(后文将介绍),如果有余地的话,可能最好直接使用 git 命令。
复制 $ got clone -am ssh://anongit@git.freebsd.org/ports.git /home/ports.git
$ got checkout /home/ports.git /usr/ports
支持的模式
不支持的模式
git+http:// (或 http:// )※错误(策略上不打算支持)
克隆所需的时间测量
git clone 的消息
复制 $ git clone --bare --single-branch ssh://anongit@git.freebsd.org/ports.git
Cloning into bare repository 'ports.git'...
remote: Enumerating objects: 5942473, done.
remote: Counting objects: 100% (171767/171767), done.
remote: Compressing objects: 100% (16358/16358), done.
remote: Total 5942473 (delta 167421), reused 155423 (delta 155409), pack-reused 5770706
Receiving objects: 100% (5942473/5942473), 1.12 GiB | 11.01 MiB/s, done.
Resolving deltas: 100% (3577978/3577978), done.
got clone 的消息
复制 $ got clone ssh://anongit@git.freebsd.org/ports.git
Connecting to ssh://anongit@git.freebsd.org/ports.git
server: Enumerating objects: 5963414, done.
server: Counting objects: 100% (133228/133228), done.
server: Compressing objects: 100% (13237/13237), done.
server: Total 5963414 (delta 129757), reused 119991 (delta 119991), pack-reused 5830186
1157M fetched; indexing 100%; resolving deltas 100%
Fetched 0d39a9d41ecbf5cd111bcc9ae9f2cfcf7e30a616.pack
Created cloned repository 'ports.git'
git clone 和 got clone 的执行时间
复制 git clone --bare --single-branch ssh://anongit@git.freebsd.org/ports.git
511.72s user 40.21s system 163% cpu 5:36.76 total
got clone ssh://anongit@git.freebsd.org/ports.git
660.88s user 75.82s system 87% cpu 14:00.91 total
执行环境大约 5 分 37 秒与 14 分 1 秒的差异,有 2.5 倍的差距。
另外,Git 的 CPU 使用率较高,表明处理效率偏向于 CPU 带宽(由多线程处理产生的效果)。
相反地,GOT 具有較高的系統使用率,可以看出瓶頸往往偏向 I/O 帶寬。
關於克隆時的選項指定造成的容量差異
※单分支: git clone --single-branch 或 got clone ※多分支: git clone 或 got clone -a
一応通过选项指定确认了容量的变化。此外, git 和 got 之间的差异很大,尽管为什么会出现这种差异尚不明确。可能是某种开销导致的……。
更新工作树
复制 $ cd /usr/ports && git pull
对上述命令的执行相当于下面的 got 命令。
复制 $ cd /usr/ports && got fetch && got update
本案例中的大致用法如下。有关在开发流程中可能需要的用法,请参阅命令对应表以及其他参考文献。
关于 tog 命令的额外内容
这是一个基于 ncurses 的日志查看器。它可以显示一行日志,同时在选择该日志(按下回车键)时,会显示详细日志和修改内容,非常实用。据说类似于 Git 的第三方工具中的 tig 命令。
信息
在 gotadmin 和 got 命令应用于存储库和工作树时有所不同。具体而言,安全使用的子命令大约是 info 。根据存储库或工作树的状态,显示内容会有所变化。
复制 $ gotadmin info -r /home/ports.git
repository: /home/ports.git
remote "origin": ssh://anongit@git.freebsd.org/ports.git
pack files: 4
packed objects: 5963321
packed total size: 1318M
loose objects: 0
在 git clone --bare 目录中运行 gotadmin info 并比较,显示增加了 remote 行。查看存储库下的文件时,发现不是 remote "origin" 文件中的 config ,而是 got.conf 中的 remote "origin" 设置。实际上,创建了 got.conf 文件后,显示了 remote 行。
另外,如果在工作树上运行 gotadmin info ,将显示存储库的状态。此外, got info 的执行结果将提供有关工作树的信息。
复制 $ cd /usr/ports
$ gotadmin info
repository: /home/ports.git
remote "origin": ssh://anongit@git.freebsd.org/ports.git
pack files: 4
packed objects: 5963321
packed total size: 1318M
loose objects: 0
$ got info
work tree: /usr/ports
work tree base commit: 388fa384c1dab4774d4db755ec1089b57e6f9a97
work tree path prefix: /
work tree branch reference: refs/heads/main
work tree UUID: 0c2bbcf5-8a1d-11ee-8d56-9ca3ba01eed8
repository: /home/ports.git
常见问题及其答案
问: https 模式不可用吗?
A. 可能是因为它不依赖于 curl 。在普通的 HTTP 通信实现中,可能会遇到无法进行并行处理的问题……这只是我的猜测。如果使用 ssh:// ,那里到处都安装了 ssh 命令,感觉很安心【需要出典】。
Q. got update / got merge / got rebase / got integrate 有什么区别?
A. 未调查。可能情况与 Git 类似。
Q. 如果 got clone ... /usr/ports/.git ,就可以创建与 git clone 完全相同的情况了!
A. 我已验证。 got clone 可成功,但 got checkout 将失败。
复制 $ got clone -m ssh://anongit@git.freebsd.org/ports.git /usr/ports/.git
Connecting to ssh://anongit@git.freebsd.org/ports.git
:
Created mirrored repository '/usr/ports/.git'
$ got checkout /usr/ports/.git /usr/ports/
got: work tree and repository paths may not overlap: /usr/ports/.git: bad path
Q. 嗯? /usr/ports/.git 是什么意思?
即是说实际上是个裸仓库的目录! 做完 git clone 后接着做 gotadmin info 就会得到惊人的结果。
问:做完 git status 就会得到惊人的结果!
答:处理 .gitignore 文件时出现了一个错误,这是个 bug。按照正常情况 .gitignore 文件指定的目录或文件等不会显示。轻轻地调查了一下,应该并不是没有处理 .gitignore 文件。所以这就是 bug 所在。
Q.别名功能呢?
A.没有。希望有这个功能。请有心人实现。
Q.这么好用了,加到基础系统里也可以吧?
A.好好使用并报告。在当前时点可能无法评价基础系统的质量是否足够。至少在我所接触的范围内,似乎还未达到那种质量水平。
参考文献