eclipse下SVN subclipse插件本文目的讓未使用過(guò)版本控制器軟件或者未使用過(guò)subversion軟件的人員盡快上手。 subversion的使用技巧很多,,這里只總結(jié)了最小使用集,,即主要的基本功能,能夠用來(lái)應(yīng)付日常工作,。 因此不涉及subversion服務(wù)器端的搭建和配置,。 為什么要使用版本控制當(dāng)多人共同開發(fā)同一個(gè)軟件時(shí),會(huì)涉及源代碼的共享以及帶來(lái)的相關(guān)問(wèn)題,,比如追究某個(gè)代碼是由誰(shuí)在什么時(shí)間修改的,。 下面列出版本控制帶來(lái)的好處:
為什么使用subversion首先,,考慮的是使用免費(fèi)開源和輕量級(jí)的版本控制器。 第二,,要求使用比較廣泛,,可選的有cvs和svn,。 這里選擇svn,主要考慮是比較好集成apache使用,,提交代碼支持原子級(jí)操作(即,,比如提交3個(gè)文件,如果因?yàn)榫W(wǎng)絡(luò)或者其他原因,,上傳2個(gè)文件后中斷,,svn能做到服務(wù)器端回滾到提交前的狀態(tài),而cvs做不到這點(diǎn),,需要手工檢查和恢復(fù)),。 subversion的程序構(gòu)成subversion程序,和mysql很類似,,是c/s結(jié)構(gòu)的,,有客戶端和服務(wù)器端。服務(wù)器端和客戶端都是通過(guò)命令行方式啟動(dòng)和執(zhí)行的,。本文只會(huì)使用到客戶端的命令,。 第三方提供了各種圖形界面的客戶端工具,比如eclipse插件subclipse,,windows圖形界面工具tortoiseSVN,。這些后面會(huì)提到它們的基本使用。 subversion資源
安裝subversion有關(guān)subversion和subclise的安裝暫略,,因?yàn)槟壳疤峁┑奶摂M機(jī)開發(fā)環(huán)境已經(jīng)安裝和配置,。 tortoiseSVN,可到官方網(wǎng)站上下載最新版本的windows安裝包,,默認(rèn)安裝,,不需要做其他設(shè)置,安裝后需要重啟計(jì)算機(jī),。能在資源管理器中鼠標(biāo)右鍵菜單看到如下圖所示條目,,就說(shuō)明安裝成功。 使用subversion日常工作中使用subversion僅僅是幾個(gè)命令或者操作,,并不復(fù)雜,。但是它內(nèi)部的一些機(jī)制需要逐漸去理解。 檢出代碼在剛開始進(jìn)入一個(gè)開發(fā)隊(duì)伍的時(shí)候,,已經(jīng)有版本控制和軟件項(xiàng)目,,使用的第一個(gè)命令往往是檢出(checkout)代碼?;蛘弋?dāng)使用和研究開源軟件的時(shí)候,,也是第一個(gè)要用到這個(gè)命令。這個(gè)命令的作用是把項(xiàng)目的源代碼下載到用戶本地,,并且?guī)в邪姹究刂菩畔ⅰ?/p> 比如,,執(zhí)行以下命令獲取一個(gè)項(xiàng)目的源代碼: 這個(gè)命令將在本地當(dāng)前目錄建vfs.demo目錄并將該服務(wù)器目錄下的所有文件下載到本地,,并且,會(huì)生成隱藏文件.SVN目錄,,用于記錄版本控制信息,。 tortoiseSVN有圖形界面的檢出操作,但是命令行方便快捷,,建議使用命令行,。 如果使用eclipse并安裝了subclipse插件,可以通過(guò)插件導(dǎo)入項(xiàng)目,。 然后,, 選擇或者新建資源庫(kù)位置, 選擇資源庫(kù)中的項(xiàng)目目錄,。 然后,,就可以完成(finish)了。 初始導(dǎo)入何時(shí)使用初始導(dǎo)入,,比如,,對(duì)于java開發(fā)人員來(lái)說(shuō),在eclipse中編寫了一個(gè)項(xiàng)目,,并決定把項(xiàng)目共享到版本控制器上,,這時(shí)就需要初始導(dǎo)入操作了。 以下以subclipse為例說(shuō)明初始導(dǎo)入的步驟,。 第一步,,選擇share project,共享你的項(xiàng)目: 選擇通過(guò)svn共享項(xiàng)目: 填寫svn提交的url: 這個(gè)url,,需要subversion的管理員告知你,,還有用戶名和密碼。如果想練習(xí)一下,,google提供了免費(fèi)的svn,,你可以通過(guò):http://code.google.com 申請(qǐng)項(xiàng)目,這樣就會(huì)有類似我上面的url和權(quán)限,。 然后可以直接點(diǎn)擊finish,,完成初始提交。選擇next,,可以做定制模塊名和初始提交的信息,一般不需要,。 如果你的svn服務(wù)器使用了https協(xié)議,,需要接受一個(gè)數(shù)字證書,一般選擇永久接受,。 之后,,會(huì)要求輸入用戶名和密碼,。建議勾選保存密碼,否則會(huì)很麻煩,。 這樣,,再看項(xiàng)目,會(huì)發(fā)現(xiàn)條目上多了問(wèn)號(hào),,這時(shí)需要選擇哪些目錄和文件需要提交,,哪些需要忽略,比如生成的class文件等,。 選擇需要忽略的文件或者目錄,,這時(shí)需要切換到導(dǎo)航視圖下才能看到所有文件和目錄: 從導(dǎo)航視圖看到的情況: 選中需要忽略的目錄和文件,操作svn: 然后提交整個(gè)項(xiàng)目即可,。有關(guān)提交的操作見(jiàn)下文,。 更新項(xiàng)目項(xiàng)目在提交前,應(yīng)該先做更新項(xiàng)目操作,。比如有一個(gè)文件a.txt,,已經(jīng)提交到svn中,這樣,,可能有其他用戶提交了新的改動(dòng)到a.txt,,你現(xiàn)在又修改了a.txt,準(zhǔn)備提交你的改動(dòng),。先操作更新a.txt,,這樣如果該文件在svn服務(wù)器已經(jīng)改動(dòng),會(huì)將改動(dòng)加入到當(dāng)前本地的a.txt中,。 在subclipse中的操作: 提交代碼提交代碼,,一般會(huì)級(jí)聯(lián)當(dāng)前目錄下所有改動(dòng)的內(nèi)容。 刪除代碼對(duì)于不再使用的代碼,,可以直接刪除掉,,比如通過(guò)windows刪除文件,通過(guò)ubuntu的rm命令或者通過(guò)eclipse的delete功能,,然后提交項(xiàng)目,,subclipse會(huì)知道哪個(gè)文件被刪除了,并將這個(gè)變化通知給svn服務(wù)器,。 還原代碼如果代碼做了改動(dòng),,可以是多個(gè)文件,也可以刪除了文件或者新增了文件,,但是沒(méi)有提交到svn服務(wù)器,,可以通過(guò)還原功能恢復(fù)到改動(dòng)前的樣子。 版本的分支與合并版本的分支和合并,,是版本控制的核心功能,。 比如,,軟件通過(guò)版本的分支,將項(xiàng)目分配給多人做分工開發(fā),,通過(guò)版本合并,,將這些分工實(shí)現(xiàn)的代碼合并到新的版本中;或者,,修改代碼bug的時(shí)候,,可以先打出一個(gè)版本分支,保留出現(xiàn)bug的版本,,比如分支版本名稱為pre_fix_bug_2201,,這里2201表示bug的代號(hào),然后針對(duì)這個(gè)分支做修改fix這個(gè)bug,,再將修改后的內(nèi)容提交到一個(gè)新的分支版本,,比如post_fix_bug_2201,再到適當(dāng)時(shí)候?qū)⑦@個(gè)分支合并到代碼主干中去,。 以上說(shuō)了一下版本分支與合并的用途,,這里簡(jiǎn)單說(shuō)一下svn版本分支合并的基本原理。 首先是版本分支,,實(shí)際上是將當(dāng)前版本“copy”到分支上,,非常類似windows下,將某個(gè)目錄的快捷方式復(fù)制到其他路徑,。這種copy,,可以說(shuō)是輕量級(jí)copy或者叫廉價(jià)copy,不是復(fù)制版本內(nèi)容,,而是做一個(gè)內(nèi)部的引用,。這樣的copy很快,對(duì)服務(wù)器也沒(méi)有空間上的開銷,。 版本的合并,,是svn開發(fā)中的難點(diǎn),當(dāng)做版本合并的時(shí)候,,服務(wù)器會(huì)試圖智能的合并同一個(gè)文件的不同版本,,可能會(huì)帶來(lái)版本沖突,這需要操作者做手工的處理,,消除版本沖突,。合理分工的項(xiàng)目應(yīng)該可以通過(guò)管理手段盡量避免這種情況。 以下是通過(guò)subclipse演示版本分支的操作,。首先,,項(xiàng)目文檔應(yīng)該已經(jīng)全部提交,然后,選擇 然后,,填寫url,一般是在tags/目錄下: 然后默認(rèn)選項(xiàng),,next即可,,然后選擇finish按鈕。在svn的相應(yīng)路徑下就會(huì)有一個(gè)同名的項(xiàng)目,。 打分支,,實(shí)際上就是建立了一個(gè)項(xiàng)目的輕量級(jí)copy。 如何從版本的一個(gè)分支切換到另外一個(gè)分支,,這也是很重要的,,它能幫助你輕松在不同的項(xiàng)目版本中自動(dòng)切換,而不必在eclipse里維持多個(gè)項(xiàng)目,。 選擇要切換的項(xiàng)目版本路徑,,或者直接輸入亦可。 然后點(diǎn)擊ok后,,項(xiàng)目即可切換到該版本下,。 在分支上做了改動(dòng),并且已經(jīng)提交(一般tags目錄下的項(xiàng)目約定是只讀的,,不建議改動(dòng),,這里是為了舉例方便),那么,,可以將這個(gè)版本合并到trunk(主干)代碼中,,讓主干也擁有最新的代碼。 選擇需要合并的源,,比如從tags上面一個(gè)版本,,合并到主干(trunk)代碼中。 之后,,需要設(shè)置一些合并的特性,,這里默認(rèn)配置即可。 執(zhí)行完畢后,,會(huì)有一個(gè)合并報(bào)告,,可見(jiàn)沒(méi)有出現(xiàn)沖突情況。 這時(shí)候看源代碼,,可以發(fā)現(xiàn)有改動(dòng),,這些改動(dòng)就是合并過(guò)來(lái)的代碼。 改動(dòng)如果沒(méi)有問(wèn)題,,就可以提交,,這樣就完成了一次版本的合并工作。
“還原”已經(jīng)提交的改動(dòng)如果文檔沒(méi)有提交,還原是很容易的,,只需執(zhí)行還原(revert)就可以了,。有時(shí)候,已經(jīng)提交了代碼,,結(jié)果發(fā)現(xiàn)了問(wèn)題,,需要回退到之前提交的版本,就不是很容易了,。 這時(shí)候的還原,,其實(shí)是將以前的某個(gè)修訂本(revision)覆蓋當(dāng)前的本地工作拷貝。然后再提交這些改動(dòng),,成為新的修訂本,。 下面演示一下。 首先提交了一個(gè)版本的改動(dòng),,這是以后需要還原回來(lái),,這里,為了以后還原方便,,要在提交的消息中說(shuō)明改動(dòng)了什么,。(這一步在開發(fā)中是必須的,是紀(jì)律) 下面,,再修改一下項(xiàng)目,,然后提交一次,這里故意增加一個(gè)文件,。 提交以后,,后悔了,想恢復(fù)到前一個(gè)修訂版,。雖然可以通過(guò)版本號(hào)進(jìn)行覆蓋還原,,但是一般人是無(wú)法記憶這個(gè)版本號(hào)的,另外就是實(shí)際情況往往更復(fù)雜,,不會(huì)像示例中那樣是相鄰的兩個(gè)修訂版,。 所以提交修訂版時(shí)的注解消息就顯得特別重要。 這時(shí)可以通過(guò)svn的日志功能查看到這些版本和它們的注釋消息,。 看到歷次版本的消息內(nèi)容,。 這樣,根據(jù)注釋,,我們很容易找到需要還原到以前的那個(gè)修訂版,。如果不放心,我們還可以根據(jù)上下文菜單,,對(duì)比兩個(gè)修訂版的區(qū)別,。 看比較結(jié)果,。可以看出,,增加了一個(gè)文件,,另外一個(gè)文件中有一處差異。 那么,,可以確定是從125修訂版恢復(fù)(還原),。 更改后的項(xiàng)目,相當(dāng)于用125修訂版還原了126修訂版,。 可以看到126版本添加的文件不見(jiàn)了,另外VfsDemo.java文件也還原到125版本的內(nèi)容,。這時(shí)提交將成為127版本,,這個(gè)版本其實(shí)就是125版本。算是還原了主干(trunk)上的代碼,。 刷新歷史,,可以看到修訂版已經(jīng)生效。 |
|