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)提交的操作見下文。 更新項(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è)文件,也可以刪除了文件或者新增了文件,但是沒有提交到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ù)器也沒有空間上的開銷。 版本的合并,是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)告,可見沒有出現(xiàn)沖突情況。 這時(shí)候看源代碼,可以發(fā)現(xiàn)有改動(dòng),這些改動(dòng)就是合并過(guò)來(lái)的代碼。 改動(dòng)如果沒有問(wèn)題,就可以提交,這樣就完成了一次版本的合并工作。
“還原”已經(jīng)提交的改動(dòng)如果文檔沒有提交,還原是很容易的,只需執(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版本添加的文件不見了,另外VfsDemo.java文件也還原到125版本的內(nèi)容。這時(shí)提交將成為127版本,這個(gè)版本其實(shí)就是125版本。算是還原了主干(trunk)上的代碼。 刷新歷史,可以看到修訂版已經(jīng)生效。 |
|