FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 网络文章集锦
  • 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 池配置镜像来消除无效数据的影响
    • FreeBSD Bhyve PCI 直通
    • ZFS 池破坏实验
    • FreeBSD ports 开发技术研究
    • FreeBSD pkg 命令概述
    • portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got
    • ccache 在构建 FreeBSD 的 buildworld 时的效率
    • Hyper-V FreeBSD 13 安装感想
    • 关于对 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 企业工作组首次会议总结
    • OpenBSD 路由器指南
    • 认识 2023 年 FreeBSD 谷歌编程之夏的学生:Sudhanshu Mohan Kashyap
    • 认识 2023 年夏季滑铁卢大学合作学生:Naman Sood
    • FreeBSD 基金会 2023 年暑期实习生:Jake Freeland
    • 第二次企业工作组会议回顾
    • OpenBSD 与 FreeBSD:有何不同,哪个更好?
  • 2023 年 9 月以前
    • 参与宣传: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 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got
  • 开始
  • 尝试安装
  • 首先尝试克隆
  • 克隆案例
  • 支持的模式
  • 不支持的模式
  • 克隆所需的时间测量
  • 關於克隆時的選項指定造成的容量差異
  • 更新工作树
  • 关于 tog 命令的额外内容
  • 信息
  • 常见问题及其答案
  • 问: https 模式不可用吗?
  • Q. got update / got merge / got rebase / got integrate 有什么区别?
  • Q. 如果 got clone ... /usr/ports/.git ,就可以创建与 git clone 完全相同的情况了!
  • Q. 嗯? /usr/ports/.git 是什么意思?
  • 问:做完 git status 就会得到惊人的结果!
  • Q.别名功能呢?
  • Q.这么好用了,加到基础系统里也可以吧?
  • 参考文献
在GitHub上编辑
导出为 PDF
  1. 2024 年 7 月

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

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

最后更新于10个月前

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

最后更新于 2023-12-02 发布于 2023-12-02

开始

介绍了一个名为 Got 的由OpenBSD项目衍生出来的 Git 替代品。虽然它是一个 git 命令的替代品,但对于那些对 git 命令的使用没有疑问,并且对其许可证没有疑问的人来说,这是一个完全不必要的工具。由于开发者是开发者,因此其用途非常独特。

据说它的目标是支持 Git 的裸仓库兼容^ 1^。对于裸仓库的操作是兼容的。但是在所谓的工作目录(包括索引)级别上不兼容。因此,需要根据工作流程切换命令。

既然开始写一个泛论的介绍,最近的 FreeBSD 中删除了 portsnap 命令,看到使用 Git 的建议^ 2^,对于那些希望使用 portsnap 而不是 git 的人来说,可能有点不情愿……

由于 Got 专注于实现 OpenBSD 开发的工作流程,因此其代码量非常少,几乎没有依赖。它被宣称为轻量级、紧凑且不会造成头痛的工具。然而,关于其轻便性能的评价,我就不发表评论了。另外,由于要求独特的使用体验,我认为在需要严格使用 Git 的情况下最好不要使用它。

以下用例将描述目标作为 portsnap 的替代。

尝试安装

$ pkg install got

这周围也没有变化。由于没有依赖项,因此不会安装其他软件包。

通过 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://

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

不支持的模式

  • git+http:// (或 http:// )※错误(策略上不打算支持)

  • https:// ※未实装错误(待办事项)

  • 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 命令的额外内容

这是一个基于 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.好好使用并报告。在当前时点可能无法评价基础系统的质量是否足够。至少在我所接触的范围内,似乎还未达到那种质量水平。

参考文献

  1. 从 Game of Trees Goals ↩

  2. Ports Collection 的安装 ↩

https://qiita.com/nanorkyo/items/f7d2d796b8303eb656f2
Git
FreeBSD
开源操作系统
获得
portsnap
git
得到
与 got、cvs、svn、git 的比较
常见问题及其答案
FOSDEM 2023 的演讲资料
在 EuroBSDcon 2019 年的演讲材料
FreeBSD 的获取方式(使用 Git)