閔嘯 張名明 凌旺
(中國船舶重工集團公司第七二三研究所 江蘇省揚州市 225011)
在實際的軟件開發(fā)過程中,會產(chǎn)生大量的代碼與文檔,同時,相應(yīng)需求具有不確定性,因此軟件開發(fā)人員需要經(jīng)常進行項目文件的迭代與修改,因此會進一步生成更多的文檔,促使文檔管理工作量增加?;诖耍归_軟件配置管理工作極為必要,特別是進行版本控制,能夠幫助軟件開發(fā)人員更好的記錄與控制變更,值得重點探討。
版本控制是一種軟體工程技巧,借以在開發(fā)的過程中,確保由不同人所編輯的同一檔案都得到更新。實踐中,主要依托透過文檔控制記錄程序各個模組的改動,并為每次改動編上序號[1]。現(xiàn)階段,形成了一些簡單的版本控制形式,例如,賦給圖的初版一個版本等級“A”。當(dāng)做了第一次改變后,版本等級改為“B”,以此類推等等。
從軟件開發(fā)的形式來看,普遍使用團隊合作的方式進行,實踐中,會將同一軟件的不同版本部署于不同的站點,為軟件開發(fā)人員同時對軟件進行更新處理提供支持。為了更為精準的確定軟件漏洞位置,更好的實現(xiàn)軟件漏洞修補,檢索與運行不同版本的軟件極為必要,能夠迅速確定出是哪個版本的軟件出現(xiàn)問題。
同時,目前的軟件開發(fā)大多為迭代式,這意味著包含大量版本不同的程序副本。在以往的管理中,一般會簡單的將所有副本進行保存,并標注相應(yīng)的版本號。該方法雖然能夠更好區(qū)分不同版本,但是也存在明顯缺陷,具體有:
(1)效率低下。在上述版本管理方法中,要求軟件開發(fā)人員標清所有版本并進行存儲。由于軟件的迭代數(shù)較大,因此經(jīng)過較長時間的積累極容易發(fā)生錯誤。
(2)重復(fù)性工作較多。代碼庫需要不斷的向軟件開發(fā)人員授予讀寫權(quán)限,促使權(quán)限管理的工作量大幅上升。為了避免上述問題的發(fā)生,引入有效的版本控制極為必要。
另外,在軟件開發(fā)的過程中,需要團隊成員之間的良好配合,組織多個成員對同一文檔或代碼進行編輯。而對于團隊內(nèi)的不同成員來說,其在工作時間、工作強項等方面具有差異性,因此引入版本控制、可以進行文檔與代碼跟蹤記錄的平臺是必然選擇。
在集中式版本控制模式中,不同系統(tǒng)開發(fā)者的協(xié)同工作成為現(xiàn)實。該模式主要使用了一個單一集中的服務(wù)器,對所有項目文件的修訂版本進行保管。實踐中,不同系統(tǒng)的開發(fā)者利用“check out”功能完成最新文件的提取,并在實現(xiàn)修改后遞交至服務(wù)器。一般來說,版本控制允許多個開發(fā)人員在相同的時間段內(nèi)針對同一文件展開修改更新,多數(shù)版本控制系統(tǒng)中均具有自動“merge”功能,完成對不發(fā)生沖突的更新進行融合。
誠然,集中式版本控制具有較高的應(yīng)用優(yōu)勢,但是也存在著一定缺陷。其中,最為明顯的缺陷在于極為依賴服務(wù)器。一旦服務(wù)器發(fā)生故障,任何客戶端均無法展開更新的遞交。同時,若是中心數(shù)據(jù)庫在未進行備份的情況下發(fā)生損壞,則會導(dǎo)致所有數(shù)據(jù)均丟失,僅能夠保留多個客戶端的不同版本。這樣的問題阻礙著軟件項目開發(fā)的順利展開。
對于分布式版本控制而言,其能夠消除集中式版本控制的缺陷,降低了對服務(wù)器的依賴程度。實踐中,客戶端不僅僅進行基于最新版本的文件快照的提取,還會對中央代碼倉庫展開完整鏡像。在這樣的條件下,所有客戶端均具備了相對完整的代碼倉庫備份。此時,即便中央服務(wù)器發(fā)生損耗,其中的數(shù)據(jù)均可以在任意一個客戶端中得到全面恢復(fù)。
對于版本控制來說,其屬于軟件配置管理中的核心功能。版本命名系統(tǒng)促使所有在配置庫中的元素命名具有唯一性成為現(xiàn)實。由于處于基線控制的軟件配置版本證明了一定的階段性工作,因此所有版本管理均在基線的管控下。一般來說,對于非基線控制的版本,相關(guān)軟件開發(fā)人員可以在不經(jīng)過審批的前提下展開隨意變更修改。若是要修改鎖定版本,版本控制的基本流程主要如下:
(1)創(chuàng)設(shè)配置項目。根據(jù)《配置管理計劃》中的相關(guān)內(nèi)容與要求,在配置數(shù)據(jù)庫中進行屬于任務(wù)范圍內(nèi)的配置項目創(chuàng)建[2]。
(2)修改未鎖定的配置。在“check in”或“check out”功能的支持下,針對未鎖定的配置展開更新修改。
(3)批準或?qū)徟a槍Α坝媱潯鳖惖呐渲庙椖?,要求相關(guān)管理人員進行審批;針對“技術(shù)文檔”類的項目,需要展開技術(shù)審批。
(4)配置項的鎖定。完成管理審批與技術(shù)審批后,將配置項目的狀態(tài)由原有的未鎖定狀態(tài)變更至鎖定狀態(tài)。
(5)配置項目的變更。針對處于“鎖定”狀態(tài)的配置項目,要在變更控制標準流程的指導(dǎo)下完成實際的變更操作。
現(xiàn)階段,版本控制一般由CASE 工具提供支持,實現(xiàn)對不同系統(tǒng)功版本存儲的管理,并對系統(tǒng)組件的訪問行為展開有效控制。實踐中,必須要在系統(tǒng)中對組件進行提取,然后再進行編輯操作。當(dāng)將其重新放入系統(tǒng)時,新的系統(tǒng)版本生成,并由版本管理系統(tǒng)賦予其以新的名稱。在軟件配置管理的版本控制中,最主要的內(nèi)容包括檢入檢出控制、分支與合并以及歷史記錄。
建立基線后,配置項目在配置數(shù)據(jù)庫中得以良好保存,且此時的配置項目不能進行隨意修改。但是,在軟件開發(fā)的過程中,這些配置項目需要被修改,且在完成修改后依然要保存在同樣的配置數(shù)據(jù)庫內(nèi)。在此過程中,落實檢入檢出控制極為必要。對于“檢入”而言,促使軟件配置項目由軟件開發(fā)人員的工作空間轉(zhuǎn)移至配置數(shù)據(jù)庫中;對于“檢出”而言,促使軟件配置項目由配置數(shù)據(jù)庫轉(zhuǎn)移至軟件開發(fā)人員的工作空間中。檢入檢出控制為軟件開發(fā)人員訪問對象的權(quán)限保證提供了支持,并在檢出的同時對這一對象實現(xiàn)鎖定。此時,當(dāng)前檢出版本在沒有被轉(zhuǎn)換前不能再更新這個變更的配置對象。
版本分支主要對主版本進行拷貝,并展開標記;版本合成主要對版本內(nèi)容拷貝至另一個版本上從而形成新的版本,或是將兩個版本的內(nèi)容展開合并,最終形成新版本。
對于版本控制的歷史記錄來說,其對軟件的整個開發(fā)過程進行了跟蹤與記錄,方便軟件開發(fā)人員對開發(fā)過程中不同階段生成的新結(jié)果進行對比與分析,并將已修改的軟件配置項目恢復(fù)至未修改狀態(tài)[3]。同時,歷史記錄還綜合了不同人員對配置項目所作出的修改,推動軟件配置管理水平提升。
本文選取Git 系統(tǒng)為例進行說明,該系統(tǒng)屬于分布式版本控制系統(tǒng),由于其免費且開源,以此在當(dāng)前得到廣泛應(yīng)用。實踐中,Git 系統(tǒng)普遍被應(yīng)用于文件變更的跟蹤。
4.2.1 Git 倉庫
該工作區(qū)域主要用于保存項目數(shù)據(jù)以及數(shù)據(jù)庫,是本軟件版本控制系統(tǒng)中最核心的部分。在系統(tǒng)中,包含著“git clone”指令,能夠?qū)Χ嗯_計算機中的倉庫進行克隆。實踐中,拷貝的內(nèi)容均來源于Git 倉庫。
4.2.2 工作目錄
該工作區(qū)域包含著得從項目某個版本中提取出來的內(nèi)容,主要來源于Git 倉庫的壓縮數(shù)據(jù)庫,并保存于本地磁盤內(nèi)。軟件開發(fā)人員在修改時,可以在計算機本地磁盤內(nèi)獲取項目數(shù)據(jù)信息。
4.2.3 暫存區(qū)域
該工作區(qū)域主要實現(xiàn)了下次將要提交的文件列表信息的保存,普遍被設(shè)置于git directory 中。
在Git 系統(tǒng)中,存在于工作目錄中的文件可以劃分為兩種狀態(tài),即跟蹤狀態(tài)與未跟蹤狀態(tài)。其中,對于處于跟蹤狀態(tài)的文件來說,可以進一步細分為未修改狀態(tài)、修改狀態(tài)以及暫存狀態(tài)。此時,版本控制能夠?qū)Ω櫸募M行管控,當(dāng)軟件開發(fā)人員對某一文件內(nèi)容進行了修改,那么該文件就轉(zhuǎn)變?yōu)樾薷臓顟B(tài)。在這樣的情況下,若想對該文件內(nèi)容展開再一次修改,就需要使用“git add”指令,將待修改文件轉(zhuǎn)入轉(zhuǎn)存區(qū)域,并在“git commit”指令的支持下,將本次更改操作遞交至Git 倉庫內(nèi)。隨后,依托“git push”指令,促使其在遠程服務(wù)器中完成記錄。
Git 系統(tǒng)具備強大的分支功能,軟件開發(fā)人員可以利用該功能實現(xiàn)不同版本 的同時性開發(fā),且能夠隨時切換至不同的版本中展開工作。在此基礎(chǔ)上,可以將新增的分支特性融合至主分支中,促使在不變更現(xiàn)階段穩(wěn)定版本的前提下增加新功能。實踐中,當(dāng)軟件開發(fā)人員提交一個對象后,Git 分支會自動向前移動,并指向最后一個提交對象。在Git 系統(tǒng)中,包含著HEAD 特殊指針,一般指向當(dāng)前所在的本地分支。在“git check out”指令的支持下,該指針可以隨時切換至的目前的工作分支。依托Git 系統(tǒng)的分支特性,可以將穩(wěn)定的版本放在master 主分支上。在實際的軟件開發(fā)過程中,若是出現(xiàn)漏洞需要修復(fù)或有不確定的新功能需要測試,可在當(dāng)前的版本基礎(chǔ)上新建一個分支。創(chuàng)建新分支的過程如下:利用“git check out”指令,加入分支名,即可在當(dāng)前所在提交對象上完成新分支的創(chuàng)建?;诖?,能夠在不破壞主分支的基礎(chǔ)上完成軟件的漏洞修復(fù)以及新功能的安全測試。
綜上所述,在當(dāng)前的軟件開發(fā)中會將同一軟件的不同版本部署于不同的站點,方面不同人員同時對軟件進行更新處理,因此展開軟件配置管理,特別是版本控制極為必要。在版本控制工作的支持下,軟件開發(fā)人員的冗余工作得到明顯減少,且可以實現(xiàn)版本歷史記錄的跟蹤與記錄,推動著軟件開發(fā)工作的順利展開。對于Git 軟件來說,其免費且開源,能夠為版本控制工作的更好展開提供平臺支持,更好的發(fā)揮出人在軟件開發(fā)項目管理中的作用。