一、文檔背景
團隊合作是許多現代微控制器開發項目的基礎,而且現如今也有很多團隊,分布在世界各地和不同的時區。如果通過打包壓縮或者電子郵件,將源碼從一個地方發送到另一個地方,是不方便且不安全的,所以在面對這種分散式工作流時,需要盡可能為客戶提供版本控制系統,比如如今廣為人知的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 之前的版本,下載地址為:https://developer.arm.com/documentation/kan279/latest/)

圖2
(2)、點擊OK添加完GIT.SVCS文件后,SVCS窗口就會出現,如下圖3中的選項,方便我們使用按鈕,來直接調用相關的git命令。

圖3
(3)、此時先不要著急直接開始使用這些按鈕,如圖4所示,先找到并打開“Select Software Packs…”,取消掉勾選“Use latest versions of all installed Software Packs.”,因為所選軟件包版本的相關信息存儲在 Project.uvprojx 文件中,該文件也在使用此工作流程的版本控制之下,所以為了防止攜帶此信息到新環境后,而導致使用的最新版本不一致的問題,建議把這個選項去掉。

圖4
(4)、本文到這里,默認大家已經閱讀過:
周邊知識中的《https://alidocs.dingtalk.com/i/nodes/20eMKjyp81Ra5gZyujLrr0QqWxAZB1Gv?utm_scene=team_space》,知道如何安裝Git即可。
FAQ中的《https://alidocs.dingtalk.com/i/nodes/R1zknDm0WR3bOn1mIkmgj260VBQEx5rG?utm_scene=team_space》,知道基本Git的基本操作即可。
(5)、接下來,為了激活keil中按鈕的使用,我們需要先去初始化一下git倉庫,如圖5所示:

圖5
(6)、接著在Github上創立一個遠程倉庫,比如這里如圖6,取名叫:SVCS-Test。

圖6
(7)、如圖7所示,將創建好的遠程倉庫的地址:https://github.com/Emdoor-ELEC/SVCS-Test.git,通過Git命令,給遠程倉庫的HTTPS網址起個別名,方便我們待會直接調用Keil里的遠程推送命令。

圖7
(8)、按照圖8中的命令,進行添加、提交以及推送我們的工程文件,這也是為了方便我們后續keil中的操作,所以把最基礎的操作,先用命令行做一遍,后續就可以完全交給keil來操作了。

圖8
提交完成后,也可以使用 git clone https://github.com/Emdoor-ELEC/SVCS-Test.git命令,把遠程倉庫里的工程給拷貝到本地,都是可以的,如圖9所示:

圖9
(9)、接下來,我們就可以開始使用Keil中SVCS列表內的配置按鈕,來操作我們的項目了。如圖10所示,我們直接點擊Status按鈕,即可查看文件的狀態。可以看到我們的項目有了一處改動。(打開項目時,μVision 會自動生成一個 uvguix.username 文件,所以該文件被標記為未跟蹤,這個不需要管。)

圖10
(10)、點擊添加新組,命名為Document,并往里面添加一個Abstract.txt,隨便往txt中輸入一些內容,如圖11所示,然后我們再用SVCS中的Status按鈕來操作一下這個文件,即可看到該文件已被顯示為未跟蹤狀態。

圖11
(11)、要開始跟蹤(或添加)Abstract.txt,需要我們點擊一下Abstract.txt,使他在項目窗口處是突出顯示的狀態,然后才可以轉到SVCS中的Stage“Abstract.txt”,點擊Stage以后,可以看到輸出串口,自動調用了git add命令,將我們新建的Abstract.txt添加到了暫存區。

圖12
(12)、此時再用SVCS中的Status去查看工程文件的狀態時,就發現,Abstract.txt已經被添加進暫存區了,目前已經處于待提交的一個狀態了。

圖13
(13)、同樣的,如圖14所示,我們也可以在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)、在我們開始提交(commit)工程到本地倉庫之前,有一個需要注意的事項就是,在git commit 命令之前,要檢查一下項目中是不是有未添加到暫存區的文件,比如,如圖15所示,可以看到我們的uvoptx文件、uvprotx文件都還沒有被添加到暫存區,需要按照圖16的方式,將這兩個文件加入到暫存區。

圖15

圖16
(16)、當然,不是所有的文件都需要監控和添加的,這里我列出官方文檔中需要我們關注的,和不需要我們關注的:
需要關注的:
? 所有用戶生成的源文件(*.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)、接下來,就可以嘗試提交我們的工程到本地倉庫,如圖17所示,可以看到,點擊SVCS中的“Commit staged changes”,會彈出一個提交窗口,我們可以使用這個窗口,來添加這次提交時需要添加的注釋,比如:添加了Abstract.txt,刪除了Blinky.c中的空行。點擊OK,會看到下方的輸出窗口中,keil自動調用了git commit -m xxxxx命令,幫我們把暫存區的工程提交到了本地倉庫。并且,下方還顯示了這次提交的工程數量為4,剛好對應上一次使用status時,暫存區出現的4個文件,并且創建的新文件也是我們手動創建的那個Abstract.txt文件,都是對應的。

圖17
(18)、最后,當項目達到可以與他人共享的程度時,就可以將其推送到上游(版本庫服務器),也就是github上了(或者有寫入權限的服務器上)。如圖18所示,點擊SVCS中的“Push Commits to server”,即可在輸出窗口看到,keil自動調用了git push origin master的命令,該命令里的origin,就是我們在第七步中,創建好的遠程倉庫的地址。隨即我們可以轉到github倉庫去進行驗證,發現,我們的更改確實被推送上去了,也正好是我們修改的4個文件,現象也是完全對應的。

圖18
(19)、要從遠程服務器拉取最新版本,請調用SVCS中的“Pull latest version from server”,即可將遠程倉庫中的變更拉取到本地,如圖19所示,我在github上的遠程倉庫中加了一個txt文件,隨后在Keil中測試拉取功能,在輸出窗口和文件夾中,可以看到,已被拉取到本地。

圖19
三、討論分析
問1:集成只能使用官方提供的文件嗎?是否支持更多的相關功能?
答1:集成功能并不限于官方文件,可以自行更改,如圖20所示,分割線、按鈕、按鈕對應的git命令,都是我們可以自定的,只要按照相同的格式去添加,即可實現對應功能。也可以如圖22一樣,在軟件內按照進行快速修改。

圖20

圖21
問2:為什么還有很多按鈕沒有講解?
答2:此文檔僅以實現基礎操作為目標,具體更多的繁復功能,不予進行詳細的講解,自行按照官網文檔探索學習即可,官方下載鏈接為:https://developer.arm.com/documentation/kan279/latest/
四、結論
該功能在一定程度上彌補了keil軟件中沒有git功能的空缺,且給予了開發人員較大程度的自由度,去自行配置使用git命令。并且通過加載SVCS文件的方式,將命令以按鈕的形式,加載到了軟件IDE界面中,極大的方便了用戶在使用分散式工作流時的團隊合作。

首頁 > 資源中心 > FAQ
