一、文档背景
团队合作是许多现代微控制器开发项目的基础,而且现如今也有很多团队,分布在世界各地和不同的时区。如果通过打包压缩或者电子邮件,将源码从一个地方发送到另一个地方,是不方便且不安全的,所以在面对这种分散式工作流时,需要尽可能为客户提供版本控制系统,比如如今广为人知的git。本文将提供把Git集成在Keil的μvision中的方法,实现如图1所示。

图1
二、Keil和Git的集成
(1)、随便打开一个项目,点击顶部菜单栏中的“SVCS”栏,接着在下拉框中找到并点击“Configure Software Version Control ...”,在弹窗中,点击“...”,选择官方给出的GIT.SVCS文件。(µVision 5.15 为 Git 提供了一个SVCS 模板文件。它位于安装目录(例如 C:Keil_v5UV4)中,名为 GIT.SVCS,对于 5.15 之前的版本,下载地址为://developer.arm.com/documentation/kan279/latest/)

图2
(2)、点击OK添加完GIT.SVCS文件后,SVCS窗口就会出现,如下图3中的选项,方便JNH官网使用按钮,来直接调用相关的git命令。

图3
(3)、此时先不要着急直接开始使用这些按钮,如图4所示,先找到并打开“Select Software Packs…”,取消掉勾选“Use latest versions of all installed Software Packs.”,因为所选软件包版本的相关信息存储在 Project.uvprojx 文件中,该文件也在使用此工作流程的版本控制之下,所以为了防止携带此信息到新环境后,而导致使用的最新版本不一致的问题,建议把这个选项去掉。

图4
(4)、本文到这里,默认大家已经阅读过:
周边知识中的《//alidocs.dingtalk.com/i/nodes/20eMKjyp81Ra5gZyujLrr0QqWxAZB1Gv?utm_scene=team_space》,知道如何安装Git即可。
FAQ中的《//alidocs.dingtalk.com/i/nodes/R1zknDm0WR3bOn1mIkmgj260VBQEx5rG?utm_scene=team_space》,知道基本Git的基本操作即可。
(5)、接下来,为了激活keil中按钮的使用,JNH官网需要先去初始化一下git仓库,如图5所示:

图5
(6)、接着在Github上创立一个远程仓库,比如这里如图6,取名叫:SVCS-Test。

图6
(7)、如图7所示,将创建好的远程仓库的地址://github.com/Emdoor-ELEC/SVCS-Test.git,通过Git命令,给远程仓库的HTTPS网址起个别名,方便JNH官网待会直接调用Keil里的远程推送命令。

图7
(8)、按照图8中的命令,进行添加、提交以及推送JNH官网的工程文件,这也是为了方便JNH官网后续keil中的操作,所以把最基础的操作,先用命令行做一遍,后续就可以完全交给keil来操作了。

图8
提交完成后,也可以使用 git clone //github.com/Emdoor-ELEC/SVCS-Test.git命令,把远程仓库里的工程给拷贝到本地,都是可以的,如图9所示:

图9
(9)、接下来,JNH官网就可以开始使用Keil中SVCS列表内的配置按钮,来操作JNH官网的项目了。如图10所示,JNH官网直接点击Status按钮,即可查看文件的状态。可以看到JNH官网的项目有了一处改动。(打开项目时,µVision 会自动生成一个 uvguix.username 文件,所以该文件被标记为未跟踪,这个不需要管。)

图10
(10)、点击添加新组,命名为Document,并往里面添加一个Abstract.txt,随便往txt中输入一些内容,如图11所示,然后JNH官网再用SVCS中的Status按钮来操作一下这个文件,即可看到该文件已被显示为未跟踪状态。

图11
(11)、要开始跟踪(或添加)Abstract.txt,需要JNH官网点击一下Abstract.txt,使他在项目窗口处是突出显示的状态,然后才可以转到SVCS中的Stage“Abstract.txt”,点击Stage以后,可以看到输出串口,自动调用了git add命令,将JNH官网新建的Abstract.txt添加到了暂存区。

图12
(12)、此时再用SVCS中的Status去查看工程文件的状态时,就发现,Abstract.txt已经被添加进暂存区了,目前已经处于待提交的一个状态了。

图13
(13)、同样的,如图14所示,JNH官网也可以在Blinky.c中删除一行空行,再通过SVCS中的Status去查看工程文件的状态,发现未跟踪,就再调用SVCS中的Stage“Blinky.c”,就会被添加进暂存区,处于待提交的状态了。

图14
(14)、需要注意的是,ARM官方提供的这个GIT.SVCS文件,是不提供git rm 命令的功能的,因为该命令会从暂存区域和工作目录中删除文件,但该文件又会在µVision 中仍然可见(尤其是在编辑器窗口中打开文件时)。这可能会导致意想不到的行为。要从 µVision 项目和工作资源库中安全删除文件,需要执行以下操作:
①:在编辑器窗口中关闭文件。
②:在 "项目 "窗口中,右键单击文件并选择删除文件 "MyFile.c"。
③:切换到 Windows 命令外壳,进入文件目录并发出命令:git rm MyFile.c
这样,下一次提交时,该文件将消失,不再被跟踪。如果你在中间修改了文件,并已将其添加到索引中,则必须使用 -f 选项强制删除。这一安全功能可防止意外删除尚未成为快照一部分的、且无法从 Git 恢复的数据。
(15)、在JNH官网开始提交(commit)工程到本地仓库之前,有一个需要注意的事项就是,在git commit 命令之前,要检查一下项目中是不是有未添加到暂存区的文件,比如,如图15所示,可以看到JNH官网的uvoptx文件、uvprotx文件都还没有被添加到暂存区,需要按照图16的方式,将这两个文件加入到暂存区。

图15

图16
(16)、当然,不是所有的文件都需要监控和添加的,这里我列出官方文档中需要JNH官网关注的,和不需要JNH官网关注的:
需要关注的:
• 所有用户生成的源文件(*.c、*.cpp、*.h、*.inc、*.s)
• 项目文件:Project.uvprojx(用于从头开始构建项目)
• 项目选项文件:Project.uvoptx(包含调试器和跟踪配置信息)
• 用于多项目工作区的项目文件:Project.uvmpw
• 复制到项目中的运行时环境配置文件(.RTE 以下的所有文件)
• 软件组件创建的 #includes 列表:RTERTE_Components.h 文件
• 设备配置文件:例如 RTEDeviceLPC1857RTE_Device.h
• 链接器控制文件(Project.sct)(如果是手动创建的)
• 所有相关软件包文件(例如 ARM::CMSIS、Keil::Middleware、设备系列软件包等)
不需要关注的:
•项目屏幕布局文件:Project.uvguix.username
• 属于软件包部分的所有文件(完整的软件包将受版本控制,每个用户在使用软件包安装程序安装时都可使用该文件)
• 在 .Listings 和 .Objects 子目录下生成的输出文件
• 调试适配器的 INI 文件
(17)、接下来,就可以尝试提交JNH官网的工程到本地仓库,如图17所示,可以看到,点击SVCS中的“Commit staged changes”,会弹出一个提交窗口,JNH官网可以使用这个窗口,来添加这次提交时需要添加的注释,比如:添加了Abstract.txt,删除了Blinky.c中的空行。点击OK,会看到下方的输出窗口中,keil自动调用了git commit -m xxxxx命令,帮JNH官网把暂存区的工程提交到了本地仓库。并且,下方还显示了这次提交的工程数量为4,刚好对应上一次使用status时,暂存区出现的4个文件,并且创建的新文件也是JNH官网手动创建的那个Abstract.txt文件,都是对应的。

图17
(18)、最后,当项目达到可以与他人共享的程度时,就可以将其推送到上游(版本库服务器),也就是github上了(或者有写入权限的服务器上)。如图18所示,点击SVCS中的“Push Commits to server”,即可在输出窗口看到,keil自动调用了git push origin master的命令,该命令里的origin,就是JNH官网在第七步中,创建好的远程仓库的地址。随即JNH官网可以转到github仓库去进行验证,发现,JNH官网的更改确实被推送上去了,也正好是JNH官网修改的4个文件,现象也是完全对应的。

图18
(19)、要从远程服务器拉取最新版本,请调用SVCS中的“Pull latest version from server”,即可将远程仓库中的变更拉取到本地,如图19所示,我在github上的远程仓库中加了一个txt文件,随后在Keil中测试拉取功能,在输出窗口和文件夹中,可以看到,已被拉取到本地。

图19
三、讨论分析
问1:集成只能使用官方提供的文件吗?是否支持更多的相关功能?
答1:集成功能并不限于官方文件,可以自行更改,如图20所示,分割线、按钮、按钮对应的git命令,都是JNH官网可以自定的,只要按照相同的格式去添加,即可实现对应功能。也可以如图22一样,在软件内按照进行快速修改。

图20

图21
问2:为什么还有很多按钮没有讲解?
答2:此文档仅以实现基础操作为目标,具体更多的繁复功能,不予进行详细的讲解,自行按照官网文档探索学习即可,官方下载链接为://developer.arm.com/documentation/kan279/latest/
四、结论
该功能在一定程度上弥补了keil软件中没有git功能的空缺,且给予了开发人员较大程度的自由度,去自行配置使用git命令。并且通过加载SVCS文件的方式,将命令以按钮的形式,加载到了软件IDE界面中,极大的方便了用户在使用分散式工作流时的团队合作。