FreeBSD 中文社区翻译文章存档
FreeBSD 中文社区
  • FreeBSD 网络文章集锦
  • 2025 年
    • BSD 许可证一览
    • FreeBSD 上的 ZFS 日志压缩
    • 为 FreeBSD 发声:FOSDEM 2025 参会报告
    • zfs 速查手册
    • FreeBSD 开发计划
    • 谁在使用 FreeBSD(基金会官方版本)
    • FreeBSD 特色开发项目
    • 如何将基于 Electron 的应用程序移植到 FreeBSD
    • FreeBSD:原始操作系统发行版的火炬传承者
    • 浏览 FreeBSD 新的季度和两年一次发布计划
    • FreeBSD 日专访 BSD 守护神 Beastie
  • 2024 年 11 月
    • 苹果的开源基石:macOS 和 iOS 背后的 BSD 传统
    • 在动荡的开源世界中保持稳定:FreeBSD 的持久稳定性
    • 为什么你应该使用 FreeBSD
    • FreeBSD 13.4: 新特性及其发展历程
    • Quantum Leap Research 和 FreeBSD 基金会将投资 75 万美元以改善笔记本电脑支持和用户体验
    • 主权科技基金将投资 68.64 万欧元用于 FreeBSD 基础设施现代化
  • 2024 年 7 月
    • BSD 老将:Michael J. Karels 逝世,享年 68 岁
    • 讣告——Michael "Mike" John Karels
    • 配置自己的 VPN——基于 OpenBSD、Wireguard、IPv6 和广告拦截
    • 如何在 FreeBSD 中指定 CPU 类型
    • 使用 BIOS 引导和 UEFI 引导的 GPT 分区的区别和制作方法
    • 通过替换 ZFS 镜像池中的磁盘来扩容
    • 通过将 ZFS 池构建为镜像结构,消除异常数据的影响
    • ZFS 池破坏实验
    • FreeBSD ports 开发技术研究
    • FreeBSD pkg 命令概述
    • portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got
    • ccache 在构建 FreeBSD 的 buildworld 时的效率
    • 关于对 FreeBSD 发布计划和生命周期的修订
  • 2023 年 12 月
    • FreeBSD 新手?来参与社区吧
    • 介绍来 FreeBSD 的学生
    • EuroBSDCon 2023 旅行报告——Bojan Novković
    • 什么是开发播客?FreeBSD 项目的演变
    • EuroBSDCon 2023 旅行报告——Mark Johnston
    • TalkDev:探索开源的未来
    • 为什么选择 FreeBSD?Metify 展示迁移到 FreeBSD 如何对两个新产品进行增强
    • FreeBSD 基金会宣布通过 SSDF 认证
    • 2023 年全球开放大会报告
    • FreeBSD v14:恪守类 Unix 操作系统传统,提升安全性与性能
  • 2023 年 9 月
    • 认识 2023 年参与 FreeBSD 谷歌编程之夏项目的学生:Soobin Rho
    • 认识 2023 年参与 FreeBSD 谷歌编程之夏项目的学生:Aymeric Wibo
    • FreeBSD 企业工作组首次会议总结
    • 认识 2023 年 FreeBSD 谷歌编程之夏的学生:Sudhanshu Mohan Kashyap
    • 认识 2023 年夏季滑铁卢大学合作学生:Naman Sood
    • FreeBSD 基金会 2023 年暑期实习生:Jake Freeland
    • 第二次企业工作组会议回顾
    • OpenBSD 与 FreeBSD:有何不同,哪个更好?
  • 2023 年 9 月以前
    • 在 FreeBSD 的 jail 中安装 NextCloud
    • 参与宣传:2023 年 5 月的 FreeBSD 开发者峰会和 BSDCan
    • 恭喜 FreeBSD 迎来 30 周年!为什么开源项目 FreeBSD 能够持续存在
    • 庆祝 FreeBSD 成立 30 周年:许可证
    • 聚集在开放领域工作的公益和慈善基金会
    • 在 Linode 上安装 pfSense
    • 在 FreeBSD 的 jail 中安装 NextCloud
    • 将 FreeBSD 上的 Ansible 主机和客户机都安装在 Jail 中
    • FreeBSD 简介 | BSD.pw 研讨会
    • 如何在 FreeBSD 上安装 Python
    • 升级到 FreeBSD 13.2 的十大理由
    • 采访 FreeBSD 基金会执行董事 Deb Goodkin
    • 我们使用开源的 FreeBSD 作为企业操作系统的 5 个原因
    • 关于 BSD 与 Linux 的典型讨论
    • OpenBSD 太棒了
    • systemd 背后的真正动机
    • systemd 在任何地方都不安全
    • 为什么你应该将所有东西从 Linux 迁移到 BSD
    • 如何在 FreeBSD 上设置一个简单且实际工作的 WireGuard 服务器
    • 选择 FreeBSD 而非 GNU/Linux 的技术性原因
    • GPL 之殇
    • FreeBSD 与研究社区
    • 在 OpenBSD 和 FreeBSD 之间选择的区别
    • FreeBSD 是一个令人惊叹的操作系统
    • 留意日期:2023 年 11 月的自由软件组织厂商峰会
    • JENNY 日常使用的系统:FreeBSD 13.2
    • FreeBSD Ports 中的 OPTIONS 功能介绍——使用 OPTIONS_SET/OPTIONS_UNSET/NO_DIALOG 进行操作和实践
    • FreeBSD Bhyve 上的 PCI 直通
    • 2023 年 FreebBSD 谷歌编程之夏学生介绍:Raghav Sharma
    • 2023 年 7 月软件开发项目进展报道
    • 用于研究的 FreeBSD:CHERI/Morello
    • 在 FreeBSD Jail 中使用 OpenRC 启动并运行 Devuan GNU+Linux 系统
由 GitBook 提供支持

FreeBSD 中文社区

在本页
  • 前言
  • 试着安装一下
  • 首先试试 clone
  • 克隆示例
  • 支持的协议(スキーマ)
  • 不支持的协议(スキーマ)
  • 克隆时间的测量
  • 使用 git clone 时的输出信息
  • 使用 got clone 时的输出信息
  • git clone 和 got clone 的执行时间对比
  • 克隆时的选项指定对容量的影响
  • 工作树更新
  • 附加的 tog 命令
  • 信息展示
  • 常见问题及其解答
  • 问:https 协议不能使用吗?
  • 问:got update、got merge、got rebase、got integrate 有什么区别?
  • 问:got clone ... /usr/ports/.git,不是就能创建与 git clone 完全相同的情况吗?
  • 问:/usr/ports/.git 是怎么回事?
  • 问:运行 git status 后看到惊人的结果
  • 问:有没有别名功能?
  • 问:既然能这么做,为什么不把它加入到基本系统中?
  • 参考文献

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 2024 年 7 月

portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got

上一页FreeBSD pkg 命令概述下一页ccache 在构建 FreeBSD 的 buildworld 时的效率

最后更新于11天前

这有帮助吗?

  • 原文:

  • 作者:重村法克

  • 2023-12-02

前言

本文介绍了 ,这是源自 OpenBSD 项目的 替代工具。 这是一种所谓的 git 命令的替代品,但如果你对 git 命令的使用以及其许可证完全没有疑问的话,那就使用这个工具。由于开发者的立场,这个工具的使用场景也具有独特性。

据称 Got 旨在实现对 Git 的裸数据仓库的兼容[1]。它在针对裸数据仓库的操作方面具有兼容性。相对地,在所谓的工作区(包括索引)层面上则不兼容。在工作流程中需要根据命令加以区分使用。

虽然开篇是以通用视角进行介绍的,但说实话,是因为最近 FreeBSD 中移除了 portsnap 命令,所以大家看到了一些提示说“请改用 Git”[2]。本文正是面向那些觉得“为了替代 portsnap 而引入 Git 实在有点……”的人所写的内容。

由于 Got 以实现 OpenBSD 开发工作流为目标进行开发,因此其代码量极少,依赖项也几乎没有。可以毫不夸张地称其为“轻量紧凑”。不过至于运行是否轻快……这一点暂且不予置评。 此外,由于它要求用户接受其独特的使用体验,因此如果你打算“用得很 Git”,那还是不建议使用 Got。

后续的使用案例将以替代 portsnap 为目标进行说明。

试着安装一下

$ pkg install got

这部分和安装 git 没什么不同。由于没有依赖项,因此不会安装其他包。

测试中使用的 Got 版本为 0.93。如果版本升级,文中内容可能会不适用。

首先试试 clone

got clone 和 git clone 的区别如下:

  • 仅支持克隆裸数据仓库(相当于 git clone --bare)

  • 无法指定 origin(可能因为裸仓库下 origin 没意义?)

  • 可以指定分支,默认好像是单分支模式

  • 不支持 shallow clone(浅克隆)

  • 有镜像模式(无法向克隆的仓库提交)

克隆示例

$ git clone https://git.freebsd.org/ports.git /usr/ports
$ got clone -am ssh://anongit@git.freebsd.org/ports.git /home/ports.git
$ got checkout /home/ports.git /usr/ports

支持的协议(スキーマ)

  • git://

  • git+ssh://(或者 ssh://)

不支持的协议(スキーマ)

  • git+http://(或者 http://)※ 错误(因为政策原因,未来不打算支持)

  • https:// ※ 尚未实现的错误(TODO)

  • ftp:// ※ 什么?(不确定是否被识别)

  • ftps:// ※ 什么?(不确定是否被识别)

克隆时间的测量

使用 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 绑定上。

克隆时的选项指定对容量的影响

命令
单分支模式*
多分支模式*

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 之间的差异较大,但为何会产生这种差异尚不明确,可能是某种开销造成的。

工作树更新

$ cd /usr/ports && git pull

上面执行的命令,相当于 got 命令如下:

$ cd /usr/ports && got fetch && got update

附加的 tog 命令

tog 是一款基于 ncurses 的日志查看器。它显示一行日志,当按下回车键时,会显示详细日志和修正内容,这是个非常方便的工具。它相当于 Git 的第三方工具 tig。

信息展示

Got 中用于管理仓库和工作树的命令不同。具体来说,分别是 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 行显示了更多的信息。

查看仓库下的文件时,发现 config 文件中的 remote "origin" 配置被 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 协议不能使用吗?

答:可能是因为没有依赖 curl。如果实现普通的 HTTP 通信,可能会遇到无法并行处理的问题……这是我个人的推测。而使用 ssh:// 则更加稳妥,因为很多系统中已经安装了 ssh 命令【需要引用来源】。

问:got update、got merge、got rebase、got integrate 有什么区别?

答:尚未研究。估计与 Git 中的用法相同。

问:got clone ... /usr/ports/.git,不是就能创建与 git clone 完全相同的情况吗?

答:经过验证,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

问:/usr/ports/.git 是怎么回事?

答:实际上这是一个裸仓库的目录!在 git clone 后,运行 gotadmin info,结果非常令人吃惊……

问:运行 git status 后看到惊人的结果

答:关于 .gitignore 文件的处理,有一个 bug 这是设计上的特性。本来 .gitignore 文件中指定的目录和文件是不应显示的。根据略微的研究,它并不是完全没有处理 .gitignore 文件。所以这是一个 bug 设计上的特性。

问:有没有别名功能?

答:没有。这个功能确实很需要,真希望有人能实现它。

问:既然能这么做,为什么不把它加入到基本系统中?

答:在彻底使用并报告其效果之前,不能肯定它的质量是否足够达到基本系统的要求。至少在我使用的范围内,它似乎还没有达到那个质量标准。

参考文献


支持的协议(schema)较少 ※

总之就是很慢(不会多线程进行 Resolving deltas)

对应的 got 命令如下。首先需要一个目录用于放置裸仓库。 另外这个操作会非常慢(),如果条件允许,还是建议使用 git 命令来完成。

这个是典型的使用方式。关于开发流程中需要的使用方法,请参考等参考资料。

より

追放された portsnap、変わりに git が入ってくはずだったのに、気がつけば got がいる
Got
Git
完全没有必要
后述
后述
后述
命令对照表
git
got
got、cvs、svn、git との比較
よくある質問とその答え
FOSDEM 2023 での発表資料
EuroBSDcon 2019 での発表資料
FreeBSDの入手方法(Gitの利用)
Game of Trees Goals
Ports Collection のインストール