创建补丁

来自 Alpine Linux

新的 aports 通常应该进入 testing 仓库。经过合理的测试期后,如果软件包是完整的(例如,它有 init 脚本,它有一个可工作且合理的默认配置等)并且它有一个维护者,则可以将其移动到 community 仓库。Main 仓库适用于 Linux 系统的核心软件包或其它核心软件包的依赖项。Main 仓库中的软件包不能依赖于 community 或 testing 仓库中的软件包,而 community 仓库中的软件包不能依赖于 testing 仓库中的软件包。

目前有两种方式可以贡献和提出更改:通过 Gitlab 和通过邮件列表。

通过 Gitlab 提交补丁

设置

要在 Alpine Linux 的 Gitlab 实例上提交补丁,您首先需要此处创建一个帐户。建议现在设置一个 SSH 密钥,请参阅 Gitlab 文档了解如何操作。

创建合并请求

现在您已经完成设置,您必须 fork 您想要贡献的仓库,例如,如果您想为 aports 打开一个合并请求,您将需要 fork alpine/aports,如果您遇到问题,请参阅 Gitlab 文档。属于 Alpine Linux 的其他仓库位于 Alpine 组织中。如果您已经有一个旧的 fork,请先克隆它,然后如下所示更新它。

fork 后,您可以像这样克隆仓库

git clone git@gitlab.alpinelinux.org:$USER/$REPO.git

将 $USER 替换为您的 Gitlab 帐户昵称,将 $REPO 替换为您要处理的仓库。现在您可以使用以下命令切换到另一个分支(例如,您要编辑的软件包的名称)

(如有必要,请先更新旧的 fork,请参阅变基,如下)

git checkout -b pkgname

现在进行更改,然后使用以下命令推送

git push -u origin $branchname

Gitlab 将在您的终端中打印一个 URL 以创建合并请求。

修改合并请求的更改

如果审阅者要求更改,或者您注意到您的合并请求的更改应该进行某些更改,您可以简单地将您的更改修改到正确的 commit 并强制推送。因此,如果您想更改分支顶端的 commit,您可以简单地执行

git commit --amend

如果您想更改不在分支顶端的 commit,您可以执行

git commit --fixup $SHA1_OF_COMMIT_YOU_WANT_TO_FIX

之后,您必须强制推送以更新您的合并请求

git push -f origin

基于 Alpine Linux 的 master 分支进行变基

最好始终与上游 Alpine Linux 仓库的状态保持同步,以确保稍后不会发生合并冲突。为此,您首先必须添加一个新的 git remote,它指向上游仓库(而不是您的 fork)

git remote add upstream https://gitlab.alpinelinux.org/alpine/$REPO

现在您可以使用以下命令获取所有更改

git fetch --all

然后您可以使用以下命令进行变基

git rebase

通过邮件列表提交补丁

警告: 截至 2023 年 8 月 15 日,通过邮件列表提交补丁目前已损坏


补丁应该使用 git 创建,并使用 git send-email 提交到 alpine-aports 邮件列表(这需要 git-email Alpine 软件包)。

仅使用 'git send-email' 提交最后一个 commit

要将最后一个 commit 作为补丁提交到 alpine-aports 邮件列表

git send-email --to alpine-aports@lists.alpinelinux.org -1

提示: 您可以使用以下命令在 git 配置中保存 To 地址(不需要 '--to alpine-aports@lists.alpinelinux.org')

git config sendemail.to alpine-aports@lists.alpinelinux.org

commit 消息的第一行将是 subject,长描述(用空行分隔)将是电子邮件的正文。下面的示例显示

testing/packagename: new aport <- header

https://example.com/packagename <- body
wonderful package
注意: git send-email 命令由 git-email 软件包提供(在 v2.7 和更早版本中为 git-perl)。

请参阅 Development using git#Email_configuration 了解如何配置 SMTP Auth。

使用 'git send-email' 提交多个 commit

如果您有多个 commit,您可以创建一个包含补丁的目录,并使用以下命令发送它们git send-email.

rm -Rf patches mkdir patches git format-patch -o patches origin git send-email patches --compose --no-chain-reply-to --to alpine-aports@lists.alpinelinux.org

您还可以使用以下命令为最后 x 个 commit 格式化补丁

git format-patch -x -o patches

这将为目录 "patches" 中每个本地 commit 生成补丁并发送它们。使用 --no-chain-reply-to 以避免每个补丁都作为对前一个补丁的回复发送。

例如。

  • [PATCH 0/m]
    • [PATCH 1/m]
      • [PATCH 2/m]
        • ...

使用 --no-chain-reply-to 选项,补丁将作为对第一封电子邮件(封面信,即 [PATCH 0/m])的回复发送,这将使电子邮件线程更清晰。像这样

  • [PATCH 0/m]
    • [PATCH 1/m]
    • [PATCH 2/m]
    • ..

重新发送更新后的补丁

有时,补丁会因补丁中的小问题而被拒绝。不要在您最初的错误补丁之上发送增量补丁。相反,重新创建补丁并发送新的、修复后的补丁版本。(使用 git commit --amend 编辑本地 commit)。

当您发送补丁的第二个版本时,请使用 --subject-prefix "PATCH v2" 来指示这是一个先前发送的补丁的新版本。您也可以使用 --in-reply-to <message-id>,其中 <message-id> 是请求重新发送的电子邮件的 ID。

您还应该写一个关于更改内容的注释。为此使用 --annotate,并将注释写在三个破折号 "---" 下面,这样注释就不会包含在 commit 消息中。例如

...
Subject: [PATCH v2] testing/mypackage: new aport

https://example.com
Example package
---
Changes v1 -> v2:
 - removed depends
 - added zlib-dev to makedepends

 testing/mypackage/APKBUILD | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 testing/mypackage/APKBUILD
...

请注意,"---" 下面的注释将不会包含在 commit 消息中。