开发分支管理
1. 开发仓库关系
在贡献开源的场景下,开发涉及到三个仓库:Github-Upstream 上游仓库,Github-Origin 个人远程仓库,Local Repository 本地仓库。如下图所示,以 ONNX Runtime 开源项目为例,上游仓库对应 microsoft/onnxruntime,个人远程仓库对应 zhangsibo1129/onnxruntime,本地仓库对应着克隆到本地计算机的代码
三者关系如图,首先从 Github-Upstream 上游仓库 Fork 一个个人远程仓库 Github-Origin,并从上游仓库 clone/fetch 最新提交信息同步到本地仓库;在本地仓库创建开发分支,进行代码开发,开发完毕后将代码 push 到个人远程仓库的分支;最后从个人远程仓库向上游仓库主干分支提交 Pull Request。
2. 个人仓库创建
进入 ONNX Runtime 开源项目主页,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
选择正确的分支,依次按提示点击
review 以及静态检查、CI 构建等通过后,committer 会进行合入操作,合入成功显示如下信息