Home 如何向开源项目提交 PR
Post
Cancel

如何向开源项目提交 PR

开发分支管理

1. 开发仓库关系

在贡献开源的场景下,开发涉及到三个仓库:Github-Upstream 上游仓库,Github-Origin 个人远程仓库,Local Repository 本地仓库。如下图所示,以 ONNX Runtime 开源项目为例,上游仓库对应 microsoft/onnxruntime,个人远程仓库对应 zhangsibo1129/onnxruntime,本地仓库对应着克隆到本地计算机的代码

branches

三者关系如图,首先从 Github-Upstream 上游仓库 Fork 一个个人远程仓库 Github-Origin,并从上游仓库 clone/fetch 最新提交信息同步到本地仓库;在本地仓库创建开发分支,进行代码开发,开发完毕后将代码 push 到个人远程仓库的分支;最后从个人远程仓库向上游仓库主干分支提交 Pull Request。

2. 个人仓库创建

进入 ONNX Runtime 开源项目主页,Fork 该项目到个人仓库

Fork

克隆代码到本地仓库,设置上游仓库和个人远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 从 upstream 克隆项目到本地
git clone https://github.com/microsoft/onnxruntime.git

# 删除当前远程仓库
git remote rm origin

# 添加 upstream 远程仓库
git remote add upstream git@github.com:microsoft/onnxruntime.git

# 添加 origin 远程仓库
git remote add origin git@github.com:zhangsibo1129/onnxruntime.git

# 查看远程仓库
git remote -v

显示如下,配置完毕

1
2
3
4
origin  git@github.com:zhangsibo1129/onnxruntime.git (fetch)
origin  git@github.com:zhangsibo1129/onnxruntime.git (push)
upstream        git@github.com:microsoft/onnxruntime.git (fetch)
upstream        git@github.com:microsoft/onnxruntime.git (push)

3. 开发分支创建

新建并切换到本地开发分支

1
git checkout -b my_dev_branch

本地代码开发

1. 从上游获取更新

同步 upstream 与 origin 仓库的 main 分支

1
2
3
4
5
6
7
8
9
10
11
# 获取 upstream 仓库的更新
git fetch upstream 

# 切换到本地 main 分支
git checkout main

# 将 upstream/main 分支合入本地 main 分支
git merge upstream/main

# 将本地 main 分支推送到 origin 仓库 main 分支
git push origin main

2. 变基到最新分支

将当前开发分支进行变基操作

1
2
3
4
5
# 切换到本地开发分支
git checkout my_dev_branch

# 变基到最新的 upstream main 分支
git rebase upstream/main

3. 代码开发

修改onnxruntime/core/providers/cann/cann_execution_provider.cc代码,运行git diff显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
diff --git a/onnxruntime/core/providers/cann/cann_execution_provider.cc b/onnxruntime/core/providers/cann/cann_execution_provider.cc
index 75996e809c..ea86603c67 100644
--- a/onnxruntime/core/providers/cann/cann_execution_provider.cc
+++ b/onnxruntime/core/providers/cann/cann_execution_provider.cc
@@ -426,12 +426,16 @@ class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain,
 class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 14, double, Relu);
 class ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain,
                                                       14, 14, float, BatchNormalization);
-class ONNX_OPERATOR_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 14, Identity);
+class ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain,
+                                                14, 18, Identity);
 class ONNX_OPERATOR_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 14, Reshape);
 
 // op 15
 class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 15, float, BatchNormalization);
 
+// op 19
+class ONNX_OPERATOR_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 19, Identity);
+
 Status RegisterCANNKernels(KernelRegistry& kernel_registry) {
   static const BuildKernelCreateInfoFn function_table[] = {
       // op 1-9
@@ -1001,12 +1005,16 @@ Status RegisterCANNKernels(KernelRegistry& kernel_registry) {
                                                                   14, double, Relu)>,
       BuildKernelCreateInfo<ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain,
                                                                             14, 14, float, BatchNormalization)>,
-      BuildKernelCreateInfo<ONNX_OPERATOR_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 14, Identity)>,
+      BuildKernelCreateInfo<ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain,
+                                                                      14, 18, Identity)>,
       BuildKernelCreateInfo<ONNX_OPERATOR_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 14, Reshape)>,
 
       // op 15
       BuildKernelCreateInfo<ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain,
                                                                   15, float, BatchNormalization)>,
+
+      // op 19
+      BuildKernelCreateInfo<ONNX_OPERATOR_KERNEL_CLASS_NAME(kCannExecutionProvider, kOnnxDomain, 19, Identity)>,
   };
 
   for (auto& function_table_entry : function_table) {

提交代码并创建 PR

代码开发完毕,但只存在本地仓库中,要先推送到个人远程仓库,才能向上游仓库提交 PR

1. 推送到个人远程仓库

提交代码到本地开发分支

1
2
3
4
5
# 添加修改文件
git add onnxruntime/core/providers/cann/cann_execution_provider.cc

# 向本地仓库提交更改
git commit -m "Fix registration of Identity operator"

将本地开发分支推送到远程个人仓库

1
git push origin my_dev_branch

此时,修改后的代码已经合入了远程个人仓库的开发分支 origin/my_dev_branch

2. 向上游创建 PR

创建 PR 的作用是将 origin/my_dev_branch 合入 upstream/main,从而实现将自己开发的代码贡献给上游社区,该操作在 Github 网页上完成,如下图所示在个人远程仓库页面创建新 PR

PR0

选择正确的分支,依次按提示点击

PR1

review 以及静态检查、CI 构建等通过后,committer 会进行合入操作,合入成功显示如下信息

PR1

This post is licensed under CC BY 4.0 by the author.