在具有版本管理的小組開發(fā)環(huán)境中,有些操作是開發(fā)人員幾乎每天都要進(jìn)行的,如提交修改工作、更新本地工作拷貝、解決沖突等。下面將詳細(xì)介紹在ECLIPSE中如何實(shí)現(xiàn)這些日常操作。在進(jìn)行這些操作前,都需要先建立與CVS服務(wù)器的連接。在ECLIPSE中進(jìn)行這些操作時(shí),如果是對(duì)目錄進(jìn)行操作,則ECLIPSE會(huì)自動(dòng)對(duì)該目錄下的子目錄和文件進(jìn)行相同的操作,對(duì)目錄的操作是遞歸嵌套的。本文在下面的講解中只以文件操作為例,但這些操作也適用于目錄。一般來(lái)說(shuō),如果在某個(gè)目錄下要對(duì)多個(gè)文件進(jìn)行相同的操作,則選擇目錄操作比較簡(jiǎn)便。另外,如不特別說(shuō)明,CVS資源庫(kù)中的文件指的是屬于主分支HEAD的文件。
下面分四種不同的工作場(chǎng)景介紹如何將對(duì)工作拷貝的修改反映到CVS資源庫(kù)。
a.簽出模塊后,在本地(Local)對(duì)文件進(jìn)行了修改,CVS資源庫(kù)中的文件沒(méi)有變化。
在工作拷貝中對(duì)SimpleTest.java作一些改動(dòng)并保存,此時(shí)ECLIPSE的畫面見圖17。在改動(dòng)的文件及其所屬的目錄前都出現(xiàn)一個(gè)箭頭,在希望提交的文件上點(diǎn)擊右鍵,在出現(xiàn)的彈出菜單中選擇【Team】→【Commit...】,在隨后出現(xiàn)的對(duì)話框中輸入注釋后單擊OK按鈕。雖然注釋不是必須輸入的,但是,最好養(yǎng)成在每次提交時(shí)寫注釋的良好習(xí)慣,這在實(shí)際的系統(tǒng)開發(fā)過(guò)程中是很有必要的。提交成功后文件的修訂版本號(hào)會(huì)自動(dòng)增加,如圖18所示,SimpleTest.java的修訂版號(hào)從1.1變成了1.2。
b.簽出模塊后,在項(xiàng)目中新建了新文件,希望將新建的文件追加到CVS資源庫(kù)中。
在新建的文件上點(diǎn)擊右鍵,在出現(xiàn)的彈出菜單中選擇【Team】→【Add to Version Control】。需要注意的是:上述操作并沒(méi)有把新建的文件追加到CVS資源庫(kù)中,為了把新建的文件追加到CVS資源庫(kù)中,還要執(zhí)行下列操作:在新建的文件上點(diǎn)擊右鍵,在出現(xiàn)的彈出菜單中選擇【Team】→【Commit...】。
c.簽出模塊后,在項(xiàng)目中刪除了文件,希望在CVS資源庫(kù)中也刪除相應(yīng)的文件。
首先在項(xiàng)目中刪除文件,然后在被刪除文件的父目錄上點(diǎn)擊右鍵,在出現(xiàn)的彈出菜單中選擇【Team】→【Commit...】。值得指出的是:上述操作只是將被刪除的文件從主分支上刪除了,但并沒(méi)有從CVS資源庫(kù)中被完全刪除,也不應(yīng)該從CVS資源庫(kù)中被完全刪除,因?yàn)槟硞€(gè)標(biāo)簽或分支可能需要被刪除的文件。
如果想恢復(fù)被刪除的文件,在ECLIPSE的Navigator視圖中選中被刪除的文件的父目錄,在右鍵菜單中選擇【Team】→【Restore from Repository...】,然后在出現(xiàn)的對(duì)話框中選擇希望從哪個(gè)修訂版恢復(fù)被刪除文件的內(nèi)容。
d.簽出模塊后,在本地(Local)對(duì)文件進(jìn)行了修改,但在提交之前,其他的開發(fā)人員已經(jīng)對(duì)同一個(gè)文件進(jìn)行了修改并提交到CVS資源庫(kù)中。
此時(shí),由于CVS資源庫(kù)中該文件的修訂版本號(hào)將高于本地該文件的修訂版本號(hào),因此將不能提交該文件。如果試圖提交該文件,ECLIPSE將彈出一個(gè)錯(cuò)誤對(duì)話框,見圖19。在這種情況下,為了能提交修改必須首先解決沖突。詳細(xì)操作見下文的沖突解決。
在小組開發(fā)環(huán)境中,應(yīng)該經(jīng)常性地提交自己的工作成果,但也不能隨意提交。一般來(lái)說(shuō),以提交的更改不對(duì)其他開發(fā)人員造成妨礙為前提條件。例如,提交的代碼應(yīng)能夠被正常編譯。如果在小組開發(fā)環(huán)境中還使用了諸如CHECKSTYLE之類的代碼審查工具,則提交的代碼除了能夠被正常編譯之外,還應(yīng)能通過(guò)代碼審查工具的審查。
在系統(tǒng)的開發(fā)過(guò)程中,開發(fā)人員不應(yīng)只關(guān)注自己的開發(fā),還應(yīng)盡量與其他開發(fā)人員保持同步,也就是需要經(jīng)常地將其他開發(fā)人員的開發(fā)成果更新到本地的工作拷貝中。
a. CVS資源庫(kù)中的文件被更新了,但本地文件沒(méi)有更新。
在開發(fā)小組中,可能有部分開發(fā)人員負(fù)責(zé)一些通用模塊的開發(fā),而其余的開發(fā)人員則專注于業(yè)務(wù)系統(tǒng)的開發(fā)。在這樣的開發(fā)場(chǎng)景中,業(yè)務(wù)系統(tǒng)的開發(fā)人員就應(yīng)經(jīng)常更新通用模塊,保持工作拷貝中的通用模塊與CVS資源庫(kù)中通用模塊的同步。在文件上點(diǎn)擊右鍵,在出現(xiàn)的彈出菜單中選擇【Team】→【Update...】。本地文件的內(nèi)容將被替換為CVS資源庫(kù)中相應(yīng)文件的內(nèi)容。
b. CVS資源庫(kù)中的文件沒(méi)有被更新,但本地文件被更新了。
此時(shí),由于本地文件的修訂版號(hào)與CVS資源庫(kù)中文件的修訂版號(hào)相同,更新操作實(shí)際上什么也不做。
c. CVS資源庫(kù)中的文件和本地文件都被更新了。
此時(shí),ECLIPSE會(huì)盡量將CVS資源庫(kù)中的內(nèi)容合并到本地文件中。如果在合并過(guò)程中沒(méi)有發(fā)現(xiàn)沖突,則合并后的文件將包含本地修改和其他開發(fā)人員的修改;如果在合并過(guò)程中產(chǎn)生了沖突,則ECLIPSE會(huì)在合并文件中著重顯示相沖突的部分,并將原本地文件作一個(gè)備份。圖20~23演示了這一過(guò)程。cvstest.txt文件1.2版本的三行的內(nèi)容分別為test line1、test line2、test line3。用戶jiangch將文件內(nèi)容修改并保存后的結(jié)構(gòu)如圖20,在jiangch提交之前,用戶cvsuser2已將文件內(nèi)容修改并提交,此時(shí)CVS資源庫(kù)中cvstest.txt的修訂版號(hào)為1.3,見圖21。
用戶jiangch在文件cvstest.txt上進(jìn)行更新操作后的結(jié)果見圖22。
第二行保持不變,但產(chǎn)生沖突的第一、三行則被標(biāo)記出來(lái)了。cvstest.txt的修訂版號(hào)也變?yōu)?.3并處于已修改狀態(tài),新產(chǎn)生的文件.#cvstest.txt.1.2是修訂版號(hào)1.2的備份文件。通過(guò)手工將jiangch與cvsuser2的修改內(nèi)容合并后就可以進(jìn)行提交操作了,圖23是一個(gè)合并后提交的結(jié)果。
ECLIPSE為CVS的操作提供了一個(gè)非常實(shí)用的功能:同步透視圖(Team Synchronizing Perspective)。通過(guò)同步透視圖,我們可以在提交、更新操作之前就發(fā)現(xiàn)可能存在的沖突。使用ECLIPSE小組開發(fā)環(huán)境的開發(fā)人員都應(yīng)該熟悉同步透視圖的使用。圖21~24演示了如何使用同步透視圖。在cvstest.txt 1.6與cvstest2.txt1.13的基礎(chǔ)上用戶jiangch對(duì)這兩個(gè)文件進(jìn)行了修改并保存。此時(shí)的結(jié)果如圖24。
用戶cvsuser2也在cvstest.txt 1.6、cvstest2.txt 1.13、TextRunnerTest.java1.1的基礎(chǔ)上對(duì)這三個(gè)文件進(jìn)行了修改并將修改結(jié)果提交到了CVS資源庫(kù)。其結(jié)果見圖25。
如果用戶jiangch不能確定只有他一個(gè)人會(huì)修改這兩個(gè)文件,他可以在如圖21的畫面上選擇這兩個(gè)文件并點(diǎn)擊右鍵,在出現(xiàn)的彈出菜單中選擇【Team】→【Synchronize with Repository...】,出現(xiàn)如圖26所示的畫面。圖中①②③④所標(biāo)識(shí)的按鈕是過(guò)濾器,分別對(duì)應(yīng)4種模式,可以控制在同步視圖中顯示何種狀態(tài)的文件。
①:Incoming模式,顯示CVS資源庫(kù)中修訂版號(hào)高于工作拷貝的文件。在實(shí)際工作中,可以選中此類文件并在右鍵菜單中選擇【Update】。也就是將其它開發(fā)人員的開 發(fā)成果反映到自己的工作拷貝中,保持與其它開發(fā)人員的同步。
②:Outgoing模式,顯示工作拷貝作了修改的文件。在實(shí)際工作中,可以選中此類文件并在右鍵菜單中選擇【Commit】。也就是將自己的開發(fā)成果反映到CVS資源庫(kù)。
③:雙向模式,顯示所有不同步的文件。包含模式①、模式②、模式④。
④:沖突模式,只顯示在本地拷貝與CVS資源庫(kù)都修改過(guò)且產(chǎn)生了沖突的文件。模式①-模式③包含了沖突模式。
處于沖突狀態(tài)下的文件是不能提交的,為了提交產(chǎn)生沖突的文件,首先必須解決沖突。雙擊產(chǎn)生了沖突的文件,可以在一個(gè)特殊的對(duì)比編輯器中同時(shí)顯示本地的工作拷貝文件與CVS資源庫(kù)中的文件。通過(guò)這個(gè)編輯器可以方便地看到哪些地方存在沖突并解決沖突。例如在圖26中,假定希望將工作拷貝的第一行和CVS資源庫(kù)的第三行作為最終的修改結(jié)果,可以從編輯器的第二列拷貝第三行到第一列的第三行并保存。在同步視圖中提交修改的操作:
1.在希望提交的文件上點(diǎn)擊右鍵,在出現(xiàn)的彈出菜單中選擇【Team】→【Mark As Merged】,這將使文件從沖突模式變?yōu)镺utgoing模式。
2.在文件的右鍵菜單中選擇【Team】→【Commit】。圖27是提交后的結(jié)果畫面。同步透視圖還包含了很多其它的實(shí)用功能,關(guān)于同步透視圖中各種按鈕與右鍵菜單的說(shuō)明可以查閱ECLIPSE的聯(lián)機(jī)幫助文檔。
在軟件項(xiàng)目的開發(fā)進(jìn)程中,可能需要參考?xì)v史版本的信息,甚至將某個(gè)文件的內(nèi)容回復(fù)到某個(gè)歷史修訂版。在ECLIPSE中也提供了這方面的功能。文件或目錄的右鍵菜單【Compare With】提供了和其它修訂版相比較的功能;右鍵菜單【Replace With】提供了將工作拷貝的內(nèi)容替換為其它修訂版內(nèi)容的功能。例如,我們修改了工作拷貝的某個(gè)文件后又想放棄修改內(nèi)容,此時(shí),可以選中文件并在右鍵菜單中選擇【Replace With】→【Last from Head】(假定CVS資源庫(kù)沒(méi)有被其他人員更新過(guò),否則【Replace With】→【Revision...】)。上述操作對(duì)目錄而言,實(shí)際上是對(duì)該目錄中的所有文件執(zhí)行操作。
在ECLIPSE中,通過(guò)文件的右鍵菜單【Team】→【Show Resource History】可以方便地查詢文件的修改履歷,例如文件cvstest.txt在某個(gè)時(shí)刻查詢到的修改履歷見圖28。從中可以看出誰(shuí)在什么時(shí)候修改了文件的內(nèi)容,也可以看出在每次提交時(shí)都寫注釋會(huì)有助于追蹤代碼的修改意圖及今后的代碼維護(hù)工作。
![]() ![]() |
![]()
|
考慮下面的應(yīng)用場(chǎng)景:在項(xiàng)目基本完成的時(shí)候,我們希望為此時(shí)的文件狀態(tài)(快照)建立一個(gè)標(biāo)簽milestone1。在后續(xù)的程序修改過(guò)程中,如果發(fā)現(xiàn)了一些在版本milestone1中不存在的BUG,我們就可以用milestone1這一統(tǒng)一的標(biāo)識(shí)獲取當(dāng)時(shí)的文件快照并與修改后的文件進(jìn)行對(duì)比,而不需要對(duì)每個(gè)文件都記住其修訂版號(hào)。
在ECLIPSE中,有兩種方法給模塊建立標(biāo)簽。方法1.在工作拷貝上建立標(biāo)簽,就JAVA項(xiàng)目而言,可以通過(guò)JAVA透視圖的右鍵菜單進(jìn)行操作;方法2. 在CVS資源庫(kù)視圖中建立標(biāo)簽。在建立標(biāo)簽之前,最好保持工作拷貝與資源庫(kù)的同步。以方法2為例,在CVS資源庫(kù)視圖的HEAD節(jié)點(diǎn)下選中希望建立標(biāo)簽的模塊,在出現(xiàn)的右鍵菜單中選擇【Tag as Version...】,在隨后出現(xiàn)的對(duì)話框中添加標(biāo)簽名即可。圖29是對(duì)模塊UnitTest建立了milestone1和milestone2兩個(gè)標(biāo)簽后的結(jié)果。
標(biāo)簽與文件修訂版號(hào)的關(guān)系見圖30。某個(gè)標(biāo)簽內(nèi)各個(gè)文件的修訂版號(hào)可能不同,例如在標(biāo)簽1中,文件A的修訂版號(hào)是1.2,而文件B的修訂版號(hào)是1.3;同一個(gè)文件的相同修訂版號(hào)也可能分屬于不同的標(biāo)簽,例如在標(biāo)簽1和標(biāo)簽2中,文件B的修訂版號(hào)都是1.3。
從標(biāo)簽簽出的模塊是靜態(tài)的,即使修改了本地的拷貝文件也不能向資源庫(kù)提交。為了證實(shí)這一點(diǎn),讀者可以先簽出Versions節(jié)點(diǎn)下的模塊,在本地做修改后再向CVS資源庫(kù)提交修改。此時(shí)將出現(xiàn)類似圖31的錯(cuò)誤提示畫面。表明提交的文件屬于標(biāo)簽milestone1,而milestone1不是分支因而不能提交。
6.2.1 建立分支
雖然通過(guò)標(biāo)簽可以方便地管理多個(gè)文件的修訂版號(hào),但是通過(guò)標(biāo)簽獲得的文件拷貝是靜態(tài)的,無(wú)法在其基礎(chǔ)上修改并提交。因此,也就不能支持下面場(chǎng)景中的并發(fā)開發(fā)。假設(shè)某軟件公司經(jīng)過(guò)一段時(shí)間的開發(fā),發(fā)布了產(chǎn)品A的1.0版。為了進(jìn)一步擴(kuò)大該產(chǎn)品的市場(chǎng)份額,隨即在1.0版本的基礎(chǔ)上進(jìn)一步研發(fā)功能更強(qiáng)大的2.0版。但是公司還必須對(duì)產(chǎn)品1.0版進(jìn)行維護(hù)和支持,如果用戶在1.0版的使用過(guò)程中發(fā)現(xiàn)了BUG,應(yīng)能盡快推出1.0修正版并發(fā)布相應(yīng)的補(bǔ)丁程序。也就是說(shuō),開發(fā)人員要能在1.0修正版與2.0版這兩條開發(fā)路線上同時(shí)工作。建立分支則可以支持上述要求。
與建立標(biāo)簽類似,在ECLIPSE中建立分支也有兩種方法。本文以在CVS資源庫(kù)視圖中的操作為例演示分支的建立過(guò)程,其步驟如下:
1. 按建立標(biāo)簽的方法建立一個(gè)新的標(biāo)簽,例如v1_0。
2. 選中新標(biāo)簽v1_0,在右鍵菜單中選擇【Add to Branch List...】(不限于新標(biāo)簽v1_0,可以在任意標(biāo)簽上操作,但是建立分支應(yīng)當(dāng)在關(guān)鍵時(shí)刻進(jìn)行)。
3. 在出現(xiàn)的對(duì)話框中輸入分支名,例如輸入"UnitText1_0_X"并確定,此時(shí)就建立了分支。但是,此時(shí)的分支是空的,沒(méi)有與之相關(guān)聯(lián)的資源。
4. 選中新標(biāo)簽v1_0,在右鍵菜單中選擇【Tag with Existing...】,在出現(xiàn)的對(duì)話框中打開節(jié)點(diǎn)Branches并選擇在步驟3新建立的分支UnitText1_0_X,最后按OK按鈕確定后就完全建立了一個(gè)新的分支,分支建好后的CVS資源庫(kù)視圖如圖32所示。
現(xiàn)在,就可以從主分支和UnitText1_0_X分支分別獲得工作拷貝。從主分支獲得的工作拷貝在提交后將反映到主分支上,而從UnitText1_0_X分支上獲得的工作拷貝在提交后將反映到UnitText1_0_X分支中,在主分支和UnitText1_0_X分支上可以互不影響地進(jìn)行并發(fā)開發(fā)。結(jié)合上述開發(fā)場(chǎng)景,產(chǎn)品A 1.0版的修正版對(duì)應(yīng)UnitTest1_0_X分支,而產(chǎn)品A 2.0版可以在主分支上繼續(xù)開發(fā)。
6. 2.2 分支修訂版號(hào)
分支中的修訂版號(hào)與主分支中的修訂版號(hào)略有不同,主分支、分支及修訂版號(hào)的關(guān)系可用圖33來(lái)說(shuō)明。
圖34顯示了文件cvstest.txt在UnitTest1_0_X分支上第一次提交后修訂版號(hào)的變化情況。其修訂版號(hào)不是從"1.10"轉(zhuǎn)變?yōu)?1.11",而是轉(zhuǎn)變?yōu)?1.10.2.1"。如果對(duì)該文件再進(jìn)行一次提交,其修訂版號(hào)將轉(zhuǎn)變?yōu)?1.10.2.2"。即變化的是最后一個(gè)小數(shù)點(diǎn)后的數(shù)字。
6.2.3 將分支上的修改合并到主分支
繼續(xù)2.1中的場(chǎng)景,開發(fā)人員在開發(fā)產(chǎn)品A 2.0版的同時(shí)還對(duì)1.0版進(jìn)行維護(hù)。開發(fā)人員根據(jù)產(chǎn)品A 1.0版用戶的反饋修正了一些BUG,由于產(chǎn)品A 2.0版也是基于1.0版繼續(xù)開發(fā)的,他們發(fā)現(xiàn)有些BUG在開發(fā)中的2.0版中也存在。此時(shí),就希望能將1.0修正版中的修改合并到主分支中。
圖35-39演示了分支合并的過(guò)程。建立UnitTest1_0_X分支后繼續(xù)在主分支上修改并提交cvstest.txt,結(jié)果如圖35所示。
從UnitTest1_0_X分支簽出一個(gè)項(xiàng)目(如果用戶jiangch或cvsuser2使用現(xiàn)有的ECLIPSE,則在簽出項(xiàng)目時(shí)需要選擇【Check Out As...】菜單并給項(xiàng)目取一個(gè)不同于"UnitTest"的名字),對(duì)文件cvstest.txt進(jìn)行修改并提交,結(jié)果如圖36所示。從圖36還可以看出,從分支簽出的項(xiàng)目在項(xiàng)目名稱的后面還會(huì)注明分支的名稱。
選擇主分支工作拷貝的cvstest.txt,在其右鍵菜單中選擇【Team】→【Merge...】,出現(xiàn)如圖37所示的對(duì)話框。在"希望被合并的分支或標(biāo)簽"輸入框中輸入"UnitTest1_0_X";在隨后的"通用基版本" 輸入框中輸入"v1_0",其意義為分支的起源版本(參見本文建立分支的步驟3和步驟4)。
在圖37中點(diǎn)擊"Finish"按鈕,將出現(xiàn)同步透視圖。如果希望將分支中文件內(nèi)容的第二行合并到主分支中,只需將其從對(duì)比編輯器第二列拷貝至第一列,然后在文件的右鍵菜單中選擇【Mark as Merged】(見圖38),最后在文件的右鍵菜單中選擇【Commit】。
合并后的結(jié)果見圖39。
![]() ![]() |
![]()
|
本文通過(guò)實(shí)例講述了如何在ECLIPSE中使用CVS進(jìn)行版本管理,由于ECLIPSE內(nèi)置了豐富的CVS功能,本文的內(nèi)容不可能面面俱到,例如,本文沒(méi)有涉及在ECLIPSE中修改CVS的相關(guān)設(shè)置。想進(jìn)一步了解相關(guān)內(nèi)容的讀者可以參考聯(lián)機(jī)幫助文檔及文后的參考資料。另外,限于水平,文中如有不當(dāng)之處,敬請(qǐng)批評(píng)指正。
聯(lián)系客服