[Mindspore相关] [VScode]论如何优雅地在gitee中提交pr
此文章focus在Windows系统下使用Visual Studio Code编辑代码、提交pr,macos和Linux系通在下载编译器和安装包时会有些许不同
准备工作
Visual Studio Code安装
Visual Studio Code(以下简称VScode)官网下载链接如下:官方下载连接
问题就是下载太慢了,所以推荐使用国内镜像下载(参考 VsCode下载,使用国内镜像秒下载)
- 首先,从上述连接进入官网下载页面,选择合适的版本进行下载。
- 其次,在下载界面单机右键,copy下载连接,下面用windows x64的下载连接为例。
https://az764295.vo.msecnd.net/stable/d045a5eda657f4d7b676dedbfa7aab8207f8a075/VSCodeUserSetup-x64-1.72.2.exe
- 最后,将链接中 /stable 前的部分替换为 vscode.cdn.azure.cn,再次点击链接下载。
https://vscode.cdn.azure.cn/stable/d045a5eda657f4d7b676dedbfa7aab8207f8a075/VSCodeUserSetup-x64-1.72.2.exe
Git 下载
我们需要将社区中的仓库clone到本地(详情见后续),git安装教程见 git windows/linux/macos下载
gitee注册
如第一次使用gitee,需在gitee官网进行用户注册,菊厂员工记得把用户名设为自己名字的拼音,不然代码出错时会被公开处刑
整体梳理
整个流程可以概括成2步:
- 将mindspore项目中的仓库保存到gitee个人账户
- 将个人账户中的仓库复制到本地pc
所以等到在本地pc上对代码进行更改后,再回推给mindspore项目,就是把上述过程反着来一遍:
- 将本地pc的更改push到个人仓库
- 将个人仓库中的更改合并到mindspore项目
接下来就是具体的操作啦
Fork远程仓库
进入Mindspore项目页面,点击仓库,搜索你的目标仓库,比如说我工作的就是在Mindspore/docs
fork结束后,点击右上角自己的头像,进入个人主页,并在个人主页的仓库中找到刚刚fork的仓库
本地clone远程仓库
这个步骤是将个人仓库复制到本地pc。
首先选择在要clone的仓库,点击进入。后点击克隆/下载,复制https链接
然后打开VScode,点击最上方的终端——新建终端,或者直接快捷键Ctrl+Shift+`
注意windows系统下默认打开的是powershell,如果想要切换到cmd,点击终端窗口右上角的+,打开下拉菜单后选择Command Prompt
(p.s. 如果以后经常用到cmd,则可以把他设置为默认,重复上面步骤的操作,只不过这次点击选择默认配置文件,然后在上方弹出的窗口中选择Command Prompt)
在终端中输入 git clone + 刚刚复制的https,一般格式为
git clone https://gitee.com/{你的用户名}/{仓库名称,比如我这里就是docs}.git
显示clone成功后,点击初始界面的启动——打开文件夹,或者快捷键Ctrl+K Ctrl+O,打开你想要access的文件夹(打开后文件路径会被储存到最近访问中,下次可以直接通过最近中的路径找到,或者Ctrl+R打开最近访问)
紧接着我们需要配置自己的用户名和邮箱地址(一次性操作)。输入:
git config --global user.email "你的邮箱"
git config --global user.name "你的姓名拼音"
最后,添加原作者的远程库(一次性操作),链接也可以通过进入mindspore项目的仓库页面复制,方法同上。
git remote add upstream https://gitee.com/mindspore/{仓库名称,如docs}.git
切换/创建/关联分支
一般像我所工作的文档教程案例部分,分支就代表了mindspore的使用版本,比如r1.9、r1.8等。可以通过 git branch
得知自己当前所在分支
切换分支
有两种方法,一种是在终端中输入git checkout {分支名称}
;另一种是在Vscode界面点击左下角的分支图标(如下图),然后在弹出的窗口中选择你想要访问的分支。
创建分支
当然还是建议创建一个自己的分支,在终端输入git checkout -b {自己创建的分支名称}
即可在当前所在分支的基础上创建一个新的分支,并跳转到该新分支上。
举个例子,如果是想自己对1.8版本的代码进行测验或者更改,那我们就需要
- 先切换到r1.8版本
- 然后在此基础上创建一个
叫做靓仔的新分支
git checkout r1.8
git checkout -b liangzai
于此同时,也需要在远程仓库中建立一个同样的分支。在gitee个人仓库页面,点击左上角的分支(默认为master),然后选择管理,在新加载的页面中点击新建分支。
随后选择起点,即想要在哪个分支基础上新建分支,并将分支命名为和你VScode新建分支一样的名字(liangzai)。
或者还有一个方法,在VScode终端用git checkout -b
新建分支后,输入
git push origin {新建分支名称}
之后用git branch -av
检查,就可以看到该分支也出现在远程仓库里了。
将本地分支与远程仓库分支关联
在VScode终端输入
git branch --set-upstream-to=origin/{新建分支名称} {新建分支名称}
总结
还用靓仔分支举例子,利用VScode终端,从创建到将本地分支推送到远程仓库并关联的全部操作为
git branch # 查看已有分支
git checkout r1.9 # 选择r1.9作为创建分支的起点
git checkout -b liangzai # 在r1.9基础上创建新分支靓仔
git push origin liangzai # 将本地分支靓仔推送到远程仓库
git branch -av # 查看靓仔是否出现在远程仓库
git branch --set-upstream-to=origin/liangzai liangzai # 将本地靓仔分支与远程靓仔分支关联
推送代码到远程仓库
推送代码
在新分支编辑完代码后,Ctrl+S保存当前文件1(这个很重要!)
这时在左侧的文件目录中,被更改的文件名称会相应变成黄色,并在旁边有一个M的标志,表示该文件被modified了2。同时,最左侧的工具栏的分支图标会出现一个下角标1,表示有一个文件被更改3。
在下方的终端,输入git add {修改文件}
,随后可用git status
检查变化是否被staged了(git status
检查这步非必须)。
接着,git commit -m "{对此更改的描述}"
,方便后续在gitee仓库的commits中回顾时了解到这步进行了什么操作。
最后,git push
将改动的代码推送到远程仓库对应分支的对应文件下。如果推送到远程仓库的分支和之前设置的不一样怎么办?使用git push origin {想要推送的分支名称}
。
用上图的resnet50.ipynb作为例子,从本地靓仔分支推送到远程靓仔分支,cmd指令总结如下:
git add resnet50.ipynb
git status # 可有可无
git commit -m "add one comment for testing"
git push # 因为之前关联过所以直接git push
这时代码已经推送过去了,可进入gitee远程仓库查看。
将原有代码和改动代码进行比较
如果我们在码代码中途突然发现一个步骤不需要改动,但奈何又手快保存好了文件,该怎么恢复原状呢?
本操作仅限于比较当前代码和最近一次git push后的版本
点击最左侧工具栏中的分支图标,在更改一栏下方找到想要对比的文件,双击该文件,就会出现当前代码和远程仓库该文件代码的比较。
想要revert操作,点击最中间的小箭头就好啦。
如果想要撤销所有的更改,可以直接点击左侧更改栏下,文件名旁边的返回箭头。
合并分支到mindspore项目
一般提交pr的时候,需要写明pr的类别,关联责任人和issue,而除了你本次编辑本来就是为了解决之前已有issue中提到的问题,往往像合并分支这样的操作都需要创建一个新的issue。
创建Issue
第一种方法,是在Mindspore项目仓库中找到你之前fork的仓库,进入仓库界面后点击+ Issue
(p.s.或者在你个人仓库界面,仓库名称下方会有很小的一行forked from Mindspore/xxx,点击这行字可以直接跳转到mindspore项目中的对应仓库)
第二种方法,点击上方工具栏的Issues,然后在新加载的界面中点击新建Issue
在issue填写界面,类别选择Task Tracking,填写好标题,最后点击创建。
创建pr
回到自己的个人仓库,重复上面创建issue的类似步骤,只不过这次选择的是+Pull Request
在创建pr界面,选择想要合并的源分支(例子中就是新创建的分支liangzai)和目标分支。
关联issue有两种途径,一种是将左侧界面下滑到底,会有一个which issue(s) this PR fixes的问题,在下方找到Fixes后输入你新建pr的编号(如果关联历史同理,复制编号,粘贴到Fixes后面);另一种是在右侧关联issue中搜索关键词后选择issue。
CLA 合约
第一次提交时会让你签署CLA合约,点击i-robort提供的链接,个人开发者签署individual CLA即可。签署成功后,机器人会自动打上mindspore-cla/yes的标签。
过门禁
在正式合并之前,需要首先经过代码审查,包括检查代码格式,变量使用问题等等。
第一次提交pr后,在评论区输入/test并发送,如果检查出现问题,会返回如下窗口
点击Details下方的一串数字,就可以进入到具体的问题解析。如下图,点击报错的环节,进入修改建议。
下图中标红框的地方就是需要修改的错误,可以根据cell number和line number以及最后的内容在原代码中进行定位,也可以根据error(如:C0326)编码来到pylilnr-error中查看具体解析。
举个例子。
这里显示我是在第21个cell的第16行中出现了C0326类错误,看后面的解释是需要在","后添加一个空格。以往万一,我们也去pylint-error中确认一下。
ummmm,确认了,就是在骂我空格用的很烂。赶快回代码中修改一下。
其实如果还是感觉通过error code查找给出的建议很模糊,可以直接复制错误描述语句,比如说这里的Exactly one space after comma,然后粘贴到浏览器中查找。
修改好后,再次git push origin liangzai
,在pr界面评论/retest,让机器人检查代码,如果出现如下的结果,那就说明代码至少在CI测试上没问题啦。
强制推送代码
但问题是,经过多次删改,CI测试是过了,但出现了stat/needs-squash的标签,怎么回事?
原因是pr中只能有一个commit,所以在代码不出问题后,需要回滚到最最开始的状态,然后一次性把全部改动强制提交。
在VScode终端中输入git log
查看过往推送代码历史,找到最初始、改动前的version(一般后面会写有origin/master的ID,如果没有,也可以通过定位author是自己账号最后一次出现的位置,它的下一个就是应该回滚到的状态了)
找到后,复制commit后的一长串黄色编号,后输入q退出,在终端中输入git reset {复制的一长串字符}
,最后再次重复推送代码的操作,只不过这次的git push
变成了git push -f
cmd总结:
git reset {复制的长字符串}
git add {更改的文件} # 如果出现多个文件被更改,可以输入[git add . ],表示stage全部有更改的文件
git commit -m {commit信息}
git push -f origin {想要推送的分支}
推送完毕后,再次回到pr界面,评论/test。在CI测试通过的消息出现时,所有需要我们完成的步骤就都结束啦,剩下的便是联系审查员来进行人工审查代码了。