portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
原文:
作者:重村法克
2023-12-02
本文介绍了 ,这是源自 OpenBSD 项目的 替代工具。
这是一种所谓的 git
命令的替代品,但如果你对 git
命令的使用以及其许可证完全没有疑问的话,那就使用这个工具。由于开发者的立场,这个工具的使用场景也具有独特性。
据称 Got 旨在实现对 Git 的裸数据仓库的兼容[1]。它在针对裸数据仓库的操作方面具有兼容性。相对地,在所谓的工作区(包括索引)层面上则不兼容。在工作流程中需要根据命令加以区分使用。
虽然开篇是以通用视角进行介绍的,但说实话,是因为最近 FreeBSD 中移除了 portsnap
命令,所以大家看到了一些提示说“请改用 Git”[2]。本文正是面向那些觉得“为了替代 portsnap 而引入 Git 实在有点……”的人所写的内容。
由于 Got 以实现 OpenBSD 开发工作流为目标进行开发,因此其代码量极少,依赖项也几乎没有。可以毫不夸张地称其为“轻量紧凑”。不过至于运行是否轻快……这一点暂且不予置评。 此外,由于它要求用户接受其独特的使用体验,因此如果你打算“用得很 Git”,那还是不建议使用 Got。
后续的使用案例将以替代 portsnap
为目标进行说明。
这部分和安装 git
没什么不同。由于没有依赖项,因此不会安装其他包。
测试中使用的 Got 版本为 0.93
。如果版本升级,文中内容可能会不适用。
got clone
和 git clone
的区别如下:
仅支持克隆裸数据仓库(相当于 git clone --bare
)
无法指定 origin(可能因为裸仓库下 origin 没意义?)
可以指定分支,默认好像是单分支模式
不支持 shallow clone(浅克隆)
有镜像模式(无法向克隆的仓库提交)
git://
git+ssh://
(或者 ssh://
)
git+http://
(或者 http://
)※ 错误(因为政策原因,未来不打算支持)
https://
※ 尚未实现的错误(TODO)
ftp://
※ 什么?(不确定是否被识别)
ftps://
※ 什么?(不确定是否被识别)
git clone
时的输出信息got clone
时的输出信息git clone
和 got clone
的执行时间对比执行环境约为 5 分 37 秒 与 14 分 1 秒之间的差异,差距为 2.5 倍。
另外,Git 的 CPU 使用率较高,处理效率偏向 CPU 绑定(通过多线程处理实现)。
相反,Got 的系统使用率较高,瓶颈主要集中在 I/O 绑定上。
got
1,306,944KB
1,326,872KB
git
1,322,480KB
1,350,344KB
单分支:git clone --single-branch
或 got clone
多分支:git clone
或 got clone -a
这里确认了不同选项指定时的容量差异。git
和 got
之间的差异较大,但为何会产生这种差异尚不明确,可能是某种开销造成的。
上面执行的命令,相当于 got
命令如下:
tog
命令tog
是一款基于 ncurses 的日志查看器。它显示一行日志,当按下回车键时,会显示详细日志和修正内容,这是个非常方便的工具。它相当于 Git 的第三方工具 tig
。
Got
中用于管理仓库和工作树的命令不同。具体来说,分别是 gotadmin
和 got
。
不过,安全使用的子命令大概只有 info
。根据仓库或工作树的状态,显示不同的信息。
如果在通过 git clone --bare
克隆的目录内运行 gotadmin info
,会看到 remote
行显示了更多的信息。
查看仓库下的文件时,发现 config
文件中的 remote "origin"
配置被 got.conf
中的 remote "origin"
配置所替代。如果创建了 got.conf
文件,remote
行便会显示出来。
另外,在工作树上执行 gotadmin info
时,会显示仓库的状态。而执行 got info
则会显示工作树相关的信息。
https
协议不能使用吗?答:可能是因为没有依赖 curl
。如果实现普通的 HTTP 通信,可能会遇到无法并行处理的问题……这是我个人的推测。而使用 ssh://
则更加稳妥,因为很多系统中已经安装了 ssh
命令【需要引用来源】。
got update
、got merge
、got rebase
、got integrate
有什么区别?答:尚未研究。估计与 Git 中的用法相同。
got clone ... /usr/ports/.git
,不是就能创建与 git clone
完全相同的情况吗?答:经过验证,got clone
可以成功执行,但 got checkout
会失败。
/usr/ports/.git
是怎么回事?答:实际上这是一个裸仓库的目录!在 git clone
后,运行 gotadmin info
,结果非常令人吃惊……
git status
后看到惊人的结果答:关于 .gitignore
文件的处理,有一个 bug 这是设计上的特性。本来 .gitignore
文件中指定的目录和文件是不应显示的。根据略微的研究,它并不是完全没有处理 .gitignore
文件。所以这是一个 bug 设计上的特性。
答:没有。这个功能确实很需要,真希望有人能实现它。
答:在彻底使用并报告其效果之前,不能肯定它的质量是否足够达到基本系统的要求。至少在我使用的范围内,它似乎还没有达到那个质量标准。
支持的协议(schema)较少 ※
总之就是很慢(不会多线程进行 Resolving deltas)
对应的 got
命令如下。首先需要一个目录用于放置裸仓库。
另外这个操作会非常慢(),如果条件允许,还是建议使用 git
命令来完成。
这个是典型的使用方式。关于开发流程中需要的使用方法,请参考等参考资料。
より