FreeBSD 中文社区翻译文章存档
FreeBSD 中文社区
  • FreeBSD 网络文章集锦
  • FreeBSD 特色开发项目(滚动更新)
  • 2025 年
    • FreeBSD 开发者正在决定是否为 FreeBSD 15 的 WiFi 采取稳定版策略
    • 伯克利 Unix 二十年——从 AT&T 掌控到自由分发
    • BSD 在 Unix 发展中的角色
    • FreeBSD 爱好者团结起来支持新兴项目 zVault——社区分支继 TrueNAS CORE 之后继续发展
    • 从 PlayStation 到路由器,你很可能一直在使用 FreeBSD 而不自知
    • FreeBSD 并没有死,别听信那些夸张的说法
    • FreeBSD 上的 ZFS 日志压缩
    • 为 FreeBSD 发声:FOSDEM 2025 参会报告
    • zfs 速查手册
    • 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 时的效率

最后更新于12天前

这有帮助吗?

  • 原文:

  • 作者:重村法克

  • 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 のインストール