# 贡献者协议（Contributing）

2023年6月26日8分钟阅读

- FormalSciences/ComputerScience
- SoftwareEngineering/Collaboration
- Git

开源项目的成功在很大程度上取决于社区的参与和贡献。然而，这种参与经常涉及到一些复杂的法律问题，尤其是与知识产权有关的问题。为了解决这些问题，开源社区引入了两种主要的贡献者协议：CLA (Contributor License Agreement) 和 DCO (Developer Certificate of Origin)。这两种协议在法律义务和责任方面有着显著的不同。

## CLA

CLA (Contributor License Agreement) 是开源协议的补充，它明确了贡献者和项目所有者之间的法律关系。CLA 协议包括公司级别和个人级别的 CLA，公司级别的 CLA 允许一个公司代表其所有员工签署，而个人级别的 CLA 则只针对个人贡献者。

CLA 协议主要涵盖以下几点：

- 签署该 CLA 的主体和贡献的定义；
- 授予著作权给拥有该软件知识产权的公司或组织；
- 专利许可的授予；
- 签署者保证依法有权授予上述许可；
- 签署者确保所有的贡献内容均为原创作品；
- 签署者为贡献内容支持的免责描述；
- 说明贡献者提交非原创作品应该采用的方式；
- 保证在获悉任何方面不准确的事实或情况之时通知签约方。

对于在中国的企业，他们还会在 CLA 协议中加入一些本地化的内容，比如阿里巴巴的 Alibaba Open Source Individual CLA
。

## DCO

DCO (Developer Certificate of Origin) 是由 Linux Foundation 制定的，它并不是一个法律协议，而是一种证明。开源贡献者只需要在提交时签署邮件地址，就相当于确认了他们对提交的贡献拥有相应的权利，并同意该贡献在该项目或涉及的开源许可下公开发布。

DCO 包含以下四点保证：

1. 贡献全部或部分由我创建，我有权根据文件中指明的开源许可提交；
2. 贡献是基于以前的工作，这些工作属于适当的开源许可，无论这些工作全部还是部分由我完成，我有权根据相同的开源许可证（除非我被允许根据不同的许可证提交）提交修改后的工作；
3. 贡献由 1、2、或 3 证明的其他人直接提供给我，而我没有对其进行修改。
4. 我理解并同意该项目和贡献是公开的，并且该贡献的记录（包括我随之提交的所有个人信息，包括我的签字）将无限期保留，并且可以与本项目或涉及的开源许可证保持一致或者重新分配。

## CLA 与 DCO 的比较

下表对比了 CLA 和 DCO 的特性，可以看出两者在法律责任、社区属性、签署方式等方面都有不同。这就需要根据项目的特点和需求来选择合适的贡献协议。

特性 | CLA | DCO
--- | --- | ---
社区属性 | 弱 | 强
签署方式 | 一次性 | 每次提交时在 commit 信息里追加 `Signed-off-by: email` 信息
法律责任 | 明确法律义务 | 无声明，用来限制提交者遵守开源 license
是否可自定义 | 公司或组织可自行定义 | 否
使用案例 | Google、Pivotal、CNCF、阿里巴巴、Apache SkyWalking | GitLab、Chef、Harbor、TiKV
公司属性 | 强，可以签署公司级别的 CLA | 弱

在选择合适的贡献协议时，不仅要考虑法律问题，也要考虑社区的文化和参与者的需求。例如，对于大型跨公司开源项目来说，CLA 可能更适合，因为它可以让项目更加正规，并且更符合长期发展的需求。而对于那些更依赖社区的项目来说，DCO 由于其简洁和易于理解的优点，可能会是更好的选择。

## 贡献者协议

文件通常被命名为 `CONTRIBUTING.md`，这个文件通常位于项目的根目录中。有一些项目可能会使用不同的文件名，例如 `CONTRIBUTORS.txt` 或 `CONTRIBUTE.md`，但是 `CONTRIBUTING.md` 是最常见的约定。

### 中文模板

    贡献者许可协议

    本贡献者许可协议（以下简称“协议”）由签署下列的一方（以下简称“贡献者”）同意，并向[项目名称]授予对由[项目名称]管理的软件项目的某些许可权。本协议自下列最新的签名日期起生效。

    1. 定义：
        “代码”指的是在此协议下由贡献者交付给[项目名称]的计算机软件代码，无论是以人类可读形式还是机器可执行形式。

    2. 版权授予：在此协议的条款和条件下，贡献者特此向[项目名称]和[项目名称]分发的软件的接收者授予永久的，全球性的，非独占的，免费的，免版税的，不可撤销的版权许可，用于复制，准备衍生作品，公开展示，公开表演，再许可，和分发代码及其衍生作品。

    贡献者声明贡献者有法律权利授予上述许可。

    贡献者名称：__________
    签名：__________
    日期：__________

### 英文模板

    Contributor License Agreement

    This Contributor License Agreement ("Agreement") is agreed to by the party signing below ("Contributor"), and conveys certain license rights to [Project Name] for software projects managed by [Project Name]. This Agreement is effective as of the latest signature date below.

    1. Definitions:
        "Code" means the computer software code, whether in human-readable or machine-executable form, that is delivered by Contributor to [Project Name] under this Agreement.

    2. Copyright Grant: Subject to the terms and conditions of this Agreement, Contributor hereby grants to [Project Name] and to recipients of software distributed by [Project Name], a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Code and such derivative works.

    Contributor represents that Contributor is legally entitled to grant the above license.

    Contributor Name: __________
    Signature: __________
    Date: __________