跳转到: 导航, 搜索

GitCommitMessages

Git 提交良好实践

以下文档基于使用 Git 进行代码开发、错误故障排除和代码审查的经验,包括 libvirt、QEMU 和 OpenStack Nova。 对 Kernel、CoreUtils、GNULIB 等其他开源项目的研究表明,它们都遵循相当通用的实践。 其动机是希望提高 Nova Git 历史记录的质量。 在计算中,质量是一个难以定义的术语;一个人眼中的“美的体现”是另一个人眼中的“邪恶的 Hack”。 然而,我们可以提出一些关于在与项目合并时该做什么或相反不该做什么的一般性指导原则,在这种情况下,OpenStack

可以将此主题分为两个方面

  1. 代码变更的结构化集合/拆分
  2. 提交消息中提供的信息

执行摘要

本文档中提出的观点和示例应清楚地说明将变更拆分为一系列单独提交的价值,以及编写与之配套的良好提交消息的重要性。 如果广泛应用这些指导原则,将显著提高 OpenStack Git 历史记录的质量。 需要胡萝卜和棒子才能实现改变。 本文档旨在成为胡萝卜,通过提醒人们好处,而任何进行 Gerrit 代码审查的人都可以充当棒子;-P

换句话说,在审查 Gerrit 中的变更时,不要仅仅查看代码的正确性。 审查提交消息本身,并要求改进其内容。 留意将多个逻辑变更混合在一起的提交,并要求提交者将其拆分为单独的提交。 确保空格更改与功能更改混合在一起。 确保无操作代码重构与功能更改分开进行。等等。

值得一提的是,Gerrit 处理补丁系列并不完全完美。 这不是避免创建补丁系列的有效理由。 使用的工具应服从开发人员的需求,并且由于它们是开源的,因此可以修复/改进它们。 软件源代码是“主要读取,偶尔写入”,因此最重要的标准是提高大型社区开发人员的长期可维护性,而不是为了可能不再接触代码的单个作者而牺牲太多。

现在是详细的指导方针和良好与不良实践示例

变更的结构化拆分

创建良好提交的首要规则是确保每个提交只有一个“逻辑变更”。 有许多原因使这条规则很重要

  • 正在更改的代码量越小,审查和识别潜在缺陷就越快、越容易。
  • 如果稍后发现更改存在缺陷,则可能需要还原有问题的提交。 如果没有其他无关代码更改与原始提交纠缠在一起,则执行此操作会容易得多。
  • 使用 Git 的 bisect 功能进行问题故障排除时,小型定义明确的更改将有助于隔离代码问题引入的确切位置。
  • 使用 Git annotate/blame 浏览历史记录时,小型定义明确的更改也有助于隔离代码来自何处以及为什么。

创建提交时应避免的事项

考虑到这一点,有一些常见的不良示例需要避免

  • 将空格更改与功能代码更改混合在一起。

空格更改会掩盖重要的功能更改,使审查人员更难正确确定更改是否正确。 解决方案:创建 2 个提交,一个包含空格更改,一个包含功能更改。 通常空格更改会先进行,但这不必是硬性规则。

  • 混合两个不相关的功能更改。

审查人员如果将两个不相关的更改混合在一起,将更难识别缺陷。 如果需要稍后还原有问题的提交,则需要解开这两个不相关的更改,并进一步增加创建错误的风险。

  • 以单个巨型提交的形式发送大型新功能。

代码用于新功能只有在全部存在时才有用。 但是,这并不意味着整个功能应以单个提交的形式提供。 新功能通常涉及重构现有代码。 强烈希望将任何重构都放在与实现新功能分开的提交中。 这有助于审查人员和测试套件验证重构没有产生意外的功能更改。 即使是新编写的代码通常可以拆分为可以独立审查的多个部分。 例如,添加新的内部 API/类的更改可以放在独立的提交中。 这同样有助于代码审查。 它还允许其他开发人员选择工作的小部分,如果整个新功能尚未准备好合并。

要遵循的基本规则是

If a code change can be split into a sequence of patches/commits, then it should be split. Less is not more. More is more.

不良实践示例

现在是一些来自 Nova 历史记录的说明。 请注意,虽然引用了提交哈希值,但删除了作者姓名,因为没有人需要被责怪/挑选出来。 几乎每个人都曾在某个时候违反这些良好实践规则。 此外,审查和批准这些提交的人与编写/提交这些提交的人一样有罪;-P

示例 1

  commit ae878fc8b9761d099a4145617e4a48cbeb390623
  Author: [removed]
  Date:   Fri Jun 1 01:44:02 2012 +0000

    Refactor libvirt create calls

     * minimizes duplicated code for create
     * makes wait_for_destroy happen on shutdown instead of undefine
     * allows for destruction of an instance while leaving the domain
     * uses reset for hard reboot instead of create/destroy
     * makes resume_host_state use new methods instead of hard_reboot
     * makes rescue/unrescue not use hard reboot to recreate domain

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I2072f93ad6c889d534b04009671147af653048e7

此提交中至少包含两个独立的更改。

  1. 切换为使用“hard_reboot”方法的新的“reset”API
  2. 调整内部驱动程序方法,以不使用“hard_reboot”

这有什么问题

  • 首先,没有令人信服的理由说明这些更改需要在同一时间进行。 第一提交可以包含停止在各个地方调用“hard_reboot”的更改。 第二提交可以重写“hard_reboot”的实现。
  • 其次,将切换到使用 libvirt 'reset' 方法隐藏在大型代码重构中,审查人员错过了这个事实,即这正在引入对较新 libvirt API 版本的依赖。 此提交被相对快速地识别为罪魁祸首,但由于包含各种不相关的更改,因此无法进行简单的还原。

示例 2

  commit e0540dfed1c1276106105aea8d5765356961ef3d
  Author: [removed]
  Date:   Wed May 16 15:17:53 2012 +0400

    blueprint lvm-disk-images

    Add ability to use LVM volumes for VM disks.

    Implements LVM disks support for libvirt driver.

    VM disks will be stored on LVM volumes in volume group
     specified by `libvirt_images_volume_group` option.
     Another option `libvirt_local_images_type` specify which storage
     type will be used. Supported values are `raw`, `lvm`, `qcow2`,
     `default`. If `libvirt_local_images_type` = `default`, usual
     logic with `use_cow_images` flag is used.
    Boolean option `libvirt_sparse_logical_volumes` controls which type
     of logical volumes will be created (sparsed with virtualsize or
     usual logical volumes with full space allocation). Default value
     for this option is `False`.
    Commit introduce three classes: `Raw`, `Qcow2` and `Lvm`. They contain
     image creation logic, that was stored in
     `LibvirtConnection._cache_image` and `libvirt_info` methods,
     that produce right `LibvirtGuestConfigDisk` configurations for
     libvirt. `Backend` class choose which image type to use.

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I0d01cb7d2fd67de2565b8d45d34f7846ad4112c2

这正在引入一个主要的新功能,因此从表面上看,使用单个提交似乎是合理的,但是查看补丁,它清楚地将大量的代码重构与新的 LVM 功能代码纠缠在一起。 这使得很难识别对 QCow2/Raw 图像支持的潜在回归。 这应该拆分为至少四个单独的提交

  1. 将 'use_cow_images' 配置 FLAG 替换为新的 FLAG 'libvirt_local_images_type',并提供对旧的 'use_cow_images' FLAG 的后向兼容代码
  2. 创建内部“Image”类和子类,用于 Raw 和 QCow2 图像类型实现
  3. 重构 libvirt 驱动程序,以替换原始/qcow2 图像管理代码,并调用新的“Image”类 API
  4. 引入新的“LVM”图像类实现

良好实践示例

示例 1

  commit 3114a97ba188895daff4a3d337b2c73855d4632d
  Author: [removed]
  Date:   Mon Jun 11 17:16:10 2012 +0100

    Update default policies for KVM guest PIT & RTC timers

  commit 573ada525b8a7384398a8d7d5f094f343555df56
  Author: [removed]
  Date:   Tue May 1 17:09:32 2012 +0100

    Add support for configuring libvirt VM clock and timers

这两个更改共同为配置 KVM 来宾计时器提供支持。 创建新的 libvirt XML 配置 API 与使用新 API 的 KVM 来宾创建策略的更改已明确分离。

示例 2

  commit 62bea64940cf629829e2945255cc34903f310115
  Author: [removed]
  Date:   Fri Jun 1 14:49:42 2012 -0400

    Add a comment to rpc.queue_get_for().
    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: Ifa7d648e9b33ad2416236dc6966527c257baaf88

  commit cf2b87347cd801112f89552a78efabb92a63bac6
  Author: [removed]
  Date:   Wed May 30 14:57:03 2012 -0400

    Add shared_storage_test methods to compute rpcapi.
...snip...
    Add get_instance_disk_info to the compute rpcapi.
...snip...
    Add remove_volume_connection to the compute rpcapi.
...snip...
    Add compare_cpu to the compute rpcapi.
...snip...
    Add get_console_topic() to the compute rpcapi.
...snip...
    Add refresh_provider_fw_rules() to compute rpcapi.
...many more commits...

此提交序列重构了 nova 内部的整个 RPC API 层,以允许可插拔的消息传递实现。 对于核心功能中的如此重大更改,将工作拆分为大量的提交对于进行有意义的代码审查和逐步识别潜在的回归至关重要。

提交消息中的信息

与更改的内容一样重要,是描述更改的提交消息的内容。 在编写提交消息时,请记住以下重要事项

  • 不要假设审查人员了解原始问题是什么。

在阅读错误报告后,经过多次来回评论,通常很难清楚地了解根本原因问题是什么。 提交消息应清楚地说明原始问题是什么。 错误只是识别问题的/如何/的有趣历史背景。 在无需阅读错误工单的情况下,应该能够审查建议的补丁的正确性。

  • 不要假设审查人员可以访问外部 Web 服务/站点。

在 6 个月后,当有人在火车/飞机/教练/海滩/酒吧中进行故障排除并浏览 Git 历史记录时,无法保证他们可以访问在线错误跟踪器或在线蓝图文档。 分布式 SCM 的伟大进步是,您不再需要“在线”即可访问代码仓库中的所有信息。 提交消息应完全自包含,以保持这种优势。

  • 不要假设代码是自解释/自记录的。

对一个人来说是显而易见的,对另一个人来说可能一团糟。 始终记录原始问题是什么以及如何修复它,对于最明显的拼写错误或仅包含空格的提交除外。

  • 描述进行更改的原因

一个常见的错误是仅记录代码的编写方式,而没有描述开发人员选择以这种方式进行的原因。 描述整体代码结构,特别是对于大型更改,但更重要的是描述意图/动机。

  • 阅读提交消息,看看它是否暗示了改进的代码结构。

通常在描述大型提交消息时,很明显提交实际上应该拆分为 2 个或多个部分。 不要害怕返回并重新基于更改以将其拆分为单独的提交。

  • 确保提供足够的信息以决定是否进行审查。

当 Gerrit 发送有关新补丁提交的电子邮件警报时,包含的信息很少,主要是提交消息和更改文件的列表。 鉴于补丁的数量众多,不能合理地期望所有审查人员详细检查补丁。 因此,提交消息必须包含足够的信息,以提醒潜在的审查人员,这是一个他们需要查看的补丁。

  • 第一行提交是最重要的。

在 Git 提交中,提交消息的第一行具有特殊意义。 它用作电子邮件主题行、git annotate 消息、gitk 查看器注释以及许多其他空间有限的位置。 除了总结更改本身外,它还应注意详细说明受影响的代码部分。 例如,如果它影响 libvirt 驱动程序,则应在第一行中提及“libvirt”。

  • 描述当前代码的任何限制。

如果正在更改的代码仍然有未来改进的空间,或任何已知的限制,请在提交消息中提及这些限制。 这表明审查人员考虑了全局图景以及短期目标与长期愿望之间的权衡。

  • 不要假设审查人员了解对更改执行的测试

理想情况下,我们希望测试是自动化的。 但是,某些场景可能需要手动测试。 添加有关对代码更改执行的手动测试的详细信息。 提交消息应包含一个“测试计划”部分,其中列出了作者对代码更改执行的测试用例标题。

  • 不要包含补丁集特定的注释。

换句话说,如果您重新基于您的更改,请不要将“补丁集 2:重新基于”添加到您的提交消息中。 这在您的更改合并后将不再相关。 但是,请在 Gerrit 中将此作为对您的更改的注释进行记录。 这有助于审查人员了解补丁集之间发生的变化。 这也适用于诸如“添加单元测试”、“修复本地化问题”或任何其他补丁集到补丁集更改不影响提交的整体意图之类的注释。

要遵循的主要规则是

The commit message must contain all the information required to fully understand & review the patch for correctness. Less is not more. More is more.

包含外部引用

提交消息主要针对人类解释,但始终为机器使用提供一些元数据。 在 OpenStack 的情况下,这包括至少“Change-id”,以及可选的“bug”ID 引用、“blueprint”名称引用、DocImpact 标志、APIImpact 标志和 SecurityImpact 标志。

  • “Change-id”行是一个描述变更的唯一哈希值,由 Git 提交钩子生成。在根据评审反馈重新整理提交时,不应更改此值,因为它被 Gerrit 用于跟踪补丁的版本。
  • “bug”行可以以多种方式引用一个错误。Gerrit 在 review.openstack.org 上查看补丁时会创建指向该错误的链接,以便评审者可以快速访问项目使用的跟踪器(Storyboard 或 Launchpad)中的错误。
    • 以下元数据可用于 Storyboard
      • Story: 1234567
        Task: 98765 -- 如果提交旨在完全实现引用的任务(与引用的 Story 相关联),请在不同的行上使用“Story”和“Task”。
      • Story: 1234567 -- 如果提交仅与引用的 Story 相关,而未实现任何任务,则仅使用“Story”(不带“Task”)。这可能表明缺少一个任务。
    • 以下元数据可用于 Launchpad
      • Closes-Bug: #1234567 -- 如果提交旨在完全修复并关闭引用的错误,请使用“Closes-Bug”。
      • Partial-Bug: #1234567 -- 如果提交只是一个部分修复,还需要更多的工作,请使用“Partial-Bug”。
      • Related-Bug: #1234567 -- 如果提交仅与引用的错误相关,请使用“Related-Bug”。
  • “blueprint”行应提供 Launchpad 蓝图的名称,如果提交旨在实现一项功能。Gerrit 在 review.openstack.org 上查看补丁时会创建指向蓝图的链接,以便评审者可以快速访问 Launchpad 上的蓝图。
  • DocImpact 行包含字符串 DocImpact,以及关于变更影响文档的注释。将 DocImpact 单独放在一行上。使用此标志指示文档包含在补丁中,或者需要文档才能理解变更。尽可能包含更多信息。当此标志包含在提交消息中时,Gerrit 会为 openstack-manuals 项目创建一个错误,以便进行分类和跟踪,或根据需要将其移动到 openstack-api-site。
  • APIImpact 行包含字符串 APIImpact,以及关于变更影响公共 HTTP API 的注释。将 APIImpact 单独放在一行上。使用此标志指示补丁创建、更新或删除公共 HTTP API,或者导致公共 HTTP API 的行为发生变化。尽可能包含更多信息。当此标志包含在提交消息中时,可以使用此报告找到所有相关的评审,该报告可供 API_Working_Group 用于帮助查找相关的评审。此外,API 工作组可以通过 OFTC 的 #openstack-sdks 频道直接联系。
  • SecurityImpact 行仅包含字符串 SecurityImpact。它用于指示变更具有安全影响,应由 OpenStack 安全组进行审查。
  • UpgradeImpact 行包含字符串 UpgradeImpact,以及关于变更影响升级的注释。它用于指示变更对进行持续部署或 N 到 N+1 升级的人员具有升级影响。同时考虑更新受影响项目的发布说明中的“升级说明”部分。

所有机器目标元数据对人类来说是次要的,因此应将它们全部分组在提交消息的末尾。

我们鼓励在提交消息中使用 Co-Authored-By: name <name@example.com> 来指示参与特定补丁工作的人员。这是一种识别多位作者的约定,我们的项目鼓励统计工具在收集统计信息时观察它。

作者和所有贡献者还必须遵守开发者行为准则,并通过在提交消息中添加 Signed-off-by 来表明这一点。这可以通过在创建提交时使用 "git commit -s" 来完成。在对变更的后续补丁中,必须保留先前作者的 Signed-off-by 行。

请参阅基础设施手册的“处理错误”部分

Git 提交消息结构的摘要

  • 在第一行提供变更的简短描述。
  • 在第一行之后插入一个空行。
  • 在以下行中提供变更的详细描述,并在需要时分段。
  • 如果合适,包括一个“测试计划”部分,其中列出了测试用例的标题。
  • 第一行应限制在 50 个字符内,并且不应以句点结尾。
  • 后续行应在 72 个字符处换行。
    • vim(大多数发行版上的默认 $EDITOR)可以自动为您换行。在大多数情况下,您只需要将示例 vimrc 文件(可以在类似 /usr/share/vim/vim74/vimrc_example.vim 的位置找到)复制到 ~/.vimrc(如果您还没有的话)。
    • 编辑段落后,可以通过按 Esc 键,确保光标位于段落内并键入 gqip 来重新换行。
  • 将“Change-id”、“Story: xxxx”和“Task: yyyy”(或者如果项目仍然使用 Launchpad,则使用“Closes-Bug #NNNNN”和“blueprint NNNNNNNNNNN”)行放在最末尾。

例如

    Switch libvirt get_cpu_info method over to use config APIs

    The get_cpu_info method in the libvirt driver currently uses
    XPath queries to extract information from the capabilities
    XML document. Switch this over to use the new config class
    LibvirtConfigCaps. Also provide a test case to validate
    the data being returned.

    DocImpact
    Closes-Bug: #1003373
    Implements: blueprint libvirt-xml-cpu-model
        Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I4946a16d27f712ae2adf8441ce78e6c0bb0bb657

一些不良实践示例

现在来看一些来自 Nova 历史的示例,再次省略作者姓名,因为没有人应该为这些错误负责。

示例 1

    commit 468e64d019f51d364afb30b0eed2ad09483e0b98
    Author: [removed]
    Date:   Mon Jun 18 16:07:37 2012 -0400

      Fix missing import in compute/utils.py

      Fixes bug 1014829
      Signed-off-by: Stacky McStackFace <stacky@openstack.org>

问题:这没有提及缺少的导入以及为什么需要它们。这些信息实际上在错误跟踪器中,应该复制到提交消息中,以便提供自包含的描述。例如:

      Add missing import of 'exception' in compute/utils.py

      nova/compute/utils.py makes a reference to exception.NotFound,
      however exception has not been imported.

示例 2

   commit 2020fba6731634319a0d541168fbf45138825357
   Author: [removed]
   Date:   Fri Jun 15 11:12:45 2012 -0600

    Present correct ec2id format for volumes and snaps

    Fixes bug 1013765
    * Add template argument to ec2utils.id_to_ec2_id() calls

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I5e574f8e60d091ef8862ad814e2c8ab993daa366

问题:这没有提及当前(损坏)的格式,也没有提及新的修复格式。同样,这些信息在错误跟踪器中可用,应该包含在提交消息中。此外,此错误是由于之前的变更引起的回归,但没有提及之前的变更是什么。例如:

    Present correct ec2id format for volumes and snaps

    During the volume uuid migration, done by changeset XXXXXXX,
    ec2 id formats for volumes and snapshots was dropped and is
    now using the default instance format (i-xxxxx). These need
    to be changed back to vol-xxx and snap-xxxx.

    Adds a template argument to ec2utils.id_to_ec2_id() calls

    Fixes bug 1013765
    Signed-off-by: Stacky McStackFace <stacky@openstack.org>

示例 3

  commit f28731c1941e57b776b519783b0337e52e1484ab
  Author: [removed]
  Date:   Wed Jun 13 10:11:04 2012 -0400

    Add libvirt min version check.

    Fixes LP Bug #1012689.

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I91c0b7c41804b2b25026cbe672b9210c305dc29b

问题:此提交消息只是记录了所做的事情,而不是为什么这样做。它应该提及引入新的 min libvirt 版本的早期变更集。它还应该提及检查失败时的行为。例如:

    Add libvirt version check, min 0.9.7

    The commit XXXXXXXX introduced use of the 'reset' API
    which is only available in libvirt 0.9.7 or newer. Add a check
    performed at startup of the compute server against the libvirt
    connection version. If the version check fails the compute
    service will shutdown.

    Fixes LP Bug #1012689.

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I91c0b7c41804b2b25026cbe672b9210c305dc29b

良好实践示例

示例 1

  commit 3114a97ba188895daff4a3d337b2c73855d4632d
  Author: [removed]
  Date:   Mon Jun 11 17:16:10 2012 +0100

    Update default policies for KVM guest PIT & RTC timers

    The default policies for the KVM guest PIT and RTC timers
    are not very good at maintaining reliable time in guest
    operating systems. In particular Windows 7 guests will
    often crash with the default KVM timer policies, and old
    Linux guests will have very bad time drift

    Set the PIT such that missed ticks are injected at the
    normal rate, ie they are delayed

    Set the RTC such that missed ticks are injected at a
    higher rate to "catch up"

    This corresponds to the following libvirt XML

      <clock offset='utc'>
        <timer name='pit' tickpolicy='delay'/>
        <timer name='rtc' tickpolicy='catchup'/>
      </clock>

    And the following KVM options

      -no-kvm-pit-reinjection
      -rtc base=utc,driftfix=slew

    This should provide a default configuration that works
    acceptably for most OS types. In the future this will
    likely need to be made configurable per-guest OS type.

    Closes-Bug: #1011848

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: Iafb0e2192b5f3c05b6395ffdfa14f86a98ce3d1f

关于此示例提交消息的一些注意事项

  • 它描述了原始问题是什么(不良 KVM 默认值)
  • 它描述了正在进行的函数变更(新的 PIT/RTC 策略)
  • 它描述了变更的结果是什么(新的 XML/QEMU 参数)
  • 它描述了未来改进的范围(可能的每操作系统类型配置)
  • 它使用了 Closes-Bug 表示法

示例 2

  commit 31336b35b4604f70150d0073d77dbf63b9bf7598
  Author: [removed]
  Date:   Wed Jun 6 22:45:25 2012 -0400

    Add CPU arch filter scheduler support

    In a mixed environment of running different CPU architecutres,
    one would not want to run an ARM instance on a X86_64 host and
    vice versa.

    This scheduler filter option will prevent instances running
    on a host that it is not intended for.

    The libvirt driver queries the guest capabilities of the
    host and stores the guest arches in the permitted_instances_types
    list in the cpu_info dict of the host.

    The Xen equivalent will be done later in another commit.

    The arch filter will compare the instance arch against
    the permitted_instances_types of a host
    and filter out invalid hosts.

    Also adds ARM as a valid arch to the filter.

    The ArchFilter is not turned on by default.

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I17bd103f00c25d6006a421252c9c8dcfd2d2c49b

关于此示例提交消息的一些注意事项

  • 它描述了问题场景是什么(混合架构部署)
  • 它描述了修复的意图(使调度器按架构过滤)
  • 它描述了修复的粗略架构(libvirt 如何返回架构)
  • 它指出了修复的局限性(Xen 上需要的工作)

示例 3

 commit 71f0e301132a7576f238fc1e51ae0ebc399dce43
 Author: [removed]
 Date:   Wed Jul 21 08:47:13 2021 -0400

    Add parallel option to the collect tool

    The current implementation of collect cycles through
    the specified host list, one after the other.

    This update adds a parallel (-p|--parallel) option to
    collect with the goal to decrease the time it takes to
    collect logs/data from all hosts in larger systems.

    This update does not change any of the current collect
    default options. The collect tool will take advantage
    of this new feature if the -p or --parallel option is
    specified on the command line when starting collect.

    Unless specified, all of the following test cases
    were executed for both serial and parallel collects.

    Test Plan:

    PASS: Verify collect output and logging

    Failure Cases: Failure Handling = FH

    PASS: Verify collect FH for an offline host
    PASS: Verify collect FH for host that recently rebooted
    PASS: Verify collect FH for host that reboots during collect
    PASS: Verify collect FH for host mgmnt network drop during collect
    PASS: Verify collect FH of various bad command line options
    PASS: Verify parallel collect overall timeout failure handling

    Regression:

    PASS: Verify dated collect
    PASS: Verify handling of unknown host
    PASS: Verify ^C|TERM|KILL running collect removes all child processes
    PASS: Verify Single host collect (any host)
    PASS: Verify Listed hosts collect (many different groupings)

    Soak:

    PASS: Verify repeated collects (50+) until after local fs is full

    Signed-off-by: Stacky McStackFace <stacky@openstack.org>
    Change-Id: I91814d14341cdc438a6d5af999b6c12d39c7d97c

关于此示例提交消息的一些注意事项

  • 它描述了原始限制是什么(顺序收集周期)
  • 它描述了正在进行的函数变更(添加并行选项)
  • 它描述了变更的意图(减少时间)
  • 它描述了执行的测试(测试计划)