11.1.使用 Git 制作补丁

当port不是作者提供的最新版本时,请更新/usr/ports的本地工作副本。port可能已经更新到新版本。

当处理超过几个ports时,使用 Git 来保持整个ports集合的最新状态可能更容易,如《使用Ports集合》中所述。这将额外带来跟踪所有port依赖项的好处。

下一步是查看是否已经有待处理的更新。为此,有两个选项。有一个可搜索的界面可访问 FreeBSD 问题报告(PR)或错误数据库。在 Product 多选菜单中选择 Ports & Packages ,并在 Summary 字段中输入port的名称。

如果没有待处理的 PR,下一步是给port的维护者发送电子邮件,如 make maintainer 所示。该人可能已经在进行升级,或者由于某种原因目前不需要升级port(例如,由于新版本的稳定性问题),因此没有必要重复他们的工作。请注意,未维护的ports将列出维护者为 ports@FreeBSD.org ,这只是一般ports邮件列表,因此在这种情况下发送邮件可能不会有所帮助。

如果维护者要求您升级,或者没有维护者,请通过使用基本系统中的 diff(1) 命令来帮助 FreeBSD 准备更新!

要为单个补丁创建一个合适的 diff ,请将需要打补丁的文件复制到 something.orig,将更改保存到 something,然后创建补丁:

% diff -u something.orig something > something.diff

否则,要么使用 git diff 方法(使用 Git 制作补丁),要么将 port 的内容复制到一个完全不同的目录,并使用新旧 ports 目录的递归 diff(1) 输出的结果(例如,如果修改后的 port 目录称为 superedit,原始目录在我们的树中称为 superedit.bak,则保存 diff -ruN superedit.bak superedit 的结果)。 统一或上下文差异都可以,但 port 提交者通常更喜欢统一差异。 注意使用 -N 选项-这是强制 diff 正确处理添加新文件或删除旧文件的情况的接受方式。 在发送给我们 diff 之前,请检查输出以确保所有更改都是合理的(特别是,请确保首先使用 make clean 清理工作目录)。

为了简化使用补丁文件的常见操作,请使用 make makepatch ,如 Patching 中所述。还存在其他工具,如/usr/ports/Tools/scripts/patchtool.py。在使用之前,请阅读/usr/ports/Tools/scripts/README.patchtool。

如果port未得到维护,并且您正在积极使用它,请考虑自愿成为其维护者。FreeBSD 有超过 4000 个ports没有维护者,这是一个始终需要更多志愿者的领域。(有关维护者责任的详细描述,请参阅开发者手册中的章节。)

要提交差异,请使用 bug 提交表单(产品 Ports & Packages ,组件 Individual Port(s) )。始终在问题的类别名称后面加上冒号和简要描述。示例: category/portname: add FOO optioncategory/portname: Update to X.Y 。请在消息中提及任何添加或删除的文件,因为在提交时必须明确指定给 git(1)。不要压缩或编码差异。

在提交 bug 之前,请查看《编写问题报告》部分。其中包含有关如何编写有用问题报告的更多信息。

现在所有这些都完成了,请阅读有关如何保持最新的内容在《保持更新》中。

11.1. 使用 Git 制作补丁

在可能的情况下,请提交一个 git(1) 补丁或差异。它们比 "新旧" 目录之间的差异更容易处理。更容易看到发生了什么变化,并在Ports集合自工作开始以来有所修改,或者提交者要求修复某些内容时更新差异。此外,使用 git-format-patch(1) 或 git-diff(1) 生成的补丁可以轻松地使用 git-am(1) 或 git-apply(1) 应用,并将为提交者节省一些时间。最后,使用 git-format-patch(1) 生成的 git 补丁包括您的作者信息和提交消息。这些将记录在存储库的日志中,这是提交更改的推荐方式。

% git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir   
% cd ~/my_wrkdir
当然,这可以放在任何地方。构建ports不限于在 /usr/ports/ 内。

git.FreeBSD.org 是 FreeBSD 公共 Git 服务器。有关更多信息,请参阅 FreeBSD Git 存储库 URL 表。

在 port 目录中,进行必要的更改。如果添加、移动或删除文件,请使用 git 来跟踪这些更改:

% git add new_file
% git mv old_name new_name
% git rm deleted_file

确保使用测试 Port 和检查 Port 的清单来检查 port 。

同时,在 distinfo 中更新校验和参考 make makesum 。

在制作补丁之前,获取最新的存储库并在其之上重新应用更改。仔细观察并遵循输出。如果任何文件未能重新应用,则意味着在您编辑相同文件时上游文件发生了更改,需要手动解决冲突。

% git fetch origin main
% git rebase origin/main

检查为补丁暂存的更改:

% git status
% git diff --staged

最后一步是制作更改的统一差异或补丁:

使用 git-format-patch(1) 生成补丁:

% git checkout -b my_branch
% git commit
% git format-patch main

这将生成一个名为 0001-foo.patch 的补丁。这是首选方式,因为它会包含作者身份信息,而且在进行一系列不打算合并在一起的更改时也更容易。

或者,使用 git-diff(1) 生成统一 diff:

% git diff --staged > ../`make -VPKGNAME`.diff

这将生成一个名为 foo-1.2.3.diff 的差异。其中 foo 将被替换为提交消息的第一行,即提交消息的主题。

创建补丁后,您可以切换到主分支开始其他开发。

% git checkout main

一旦补丁被接受并合并,如果您愿意,可以删除本地开发分支:

% git branch -D my_branch

按照问题报告提交指南发送修补程序。

最后更新于

FreeBSD 中文社区