一、SVN服務(wù)端
1、VisualSVN Server下載:
http://download.csdn.net/detail/jiminull/4448874
或
http://www.visualsvn.com/server/download/
VisualSVN Server是免費(fèi)的
2、VisualSVN Server安裝:
下載完VisualSVN Server后,只要雙擊VisualSVN Server安裝文件,按步驟點(diǎn)擊下一步安裝即可,VisualSVN Server捆綁安裝了Apache,免去了你安裝apache的麻煩。具體可以參照官網(wǎng),安裝部分英語(yǔ)比較簡(jiǎn)單,其實(shí)不看英,你只要點(diǎn)一步再配一下安裝路徑就完全OK了。同時(shí)VisualSVN Server安裝步驟中涉及了部分VisualSVN Server配置信息,我會(huì)在VisualSVN配置部分詳細(xì)介紹,VisualSVN Server安裝完畢后,即會(huì)跳出VisualSVN配置界面,如下圖

3、VisualSVN Server配置:
運(yùn)行VisualSVN Server Manger,下面是啟動(dòng)界面:

下面我來(lái)添加一個(gè)代碼庫(kù)【Repository】,如下圖:

按上圖所示,創(chuàng)建新的代碼庫(kù),在下圖所示的文本框中輸入代碼庫(kù)名稱:

注意:上圖中的CheckBox如果選中,則在代碼庫(kù)StartKit下面會(huì)創(chuàng)建 trunk、branches、tags三個(gè)子目錄;不選中,則只創(chuàng)建空的代碼庫(kù)StartKit。
點(diǎn)擊OK按鈕,代碼庫(kù)就創(chuàng)建成功了。

創(chuàng)建完代碼庫(kù)后,沒有任何內(nèi)容在里面。我會(huì)在這個(gè)教程的第二部分說明如何遷入源代碼。
下面,我們開始安全性設(shè)置,在左側(cè)的Users上點(diǎn)擊右鍵:


輸入上面的信息,點(diǎn)擊OK,我們就創(chuàng)建一個(gè)用戶了。按照上面的過程,分別添加用戶 Developer1、tester1、manager1,好了,我們開始添加這些用戶到我們剛才創(chuàng)建的項(xiàng)目里:

點(diǎn)擊上圖中的"Add..."按鈕,在下圖中選擇我們剛才添加的用戶,點(diǎn)擊OK按鈕:
說明:大家可能注意到了下圖中的Groups,是的,你也可以先創(chuàng)建組,把用戶添加到各個(gè)組 中,然后對(duì)組進(jìn)行授權(quán),操作比較簡(jiǎn)單,在此略過。

點(diǎn)擊"確定"按鈕,上面的用戶就具有了訪問StartKit代碼庫(kù)的不同權(quán)限。
因?yàn)橛脩魋tarter在團(tuán)隊(duì)中是新來(lái)者,不希望他向代碼庫(kù)中提交新代碼,所以他只能讀取代 碼庫(kù)中的代碼,不能提交代碼。tester1是測(cè)試人員,不負(fù)責(zé)代碼編寫,所以也是只讀權(quán)限。而Developer1和manager1是開發(fā)人員和項(xiàng)目 經(jīng)理,自然具有讀、寫的權(quán)限。
在實(shí)際的項(xiàng)目開發(fā)過程中,Developer和tester往往不可能只有一個(gè)人,這時(shí)候使 用組來(lái)授權(quán)更加方便,這個(gè)大家可以自己練習(xí)一下。
二、SVN客戶端
VisualSVN客戶端是收費(fèi)的,所以我們安裝TortoiseSVN客戶端
TotoiseSVN在64位系統(tǒng)和32位系統(tǒng)的客戶端是不兼容的,請(qǐng)下載適合的版本。
下載地址:
32位:http://download.csdn.net/detail/jiminull/4442642
63位:http://download.csdn.net/detail/jiminull/4442645
TotoiseSVN 的基本使用方法:
1、簽入源代碼到SVN服務(wù)器
假如我們使用Visual Studio在文件夾StartKit中創(chuàng)建了一個(gè)項(xiàng)目,我們要把這個(gè)項(xiàng)目的源代碼簽入到SVN Server上的代碼庫(kù)中里,首先右鍵點(diǎn)擊StartKit文件夾,這時(shí)候的右鍵菜單如下圖所示:
圖2-2-1

點(diǎn)擊Import,彈出下面的窗體,其中http://zt.NET.henu.edu.cn 是服務(wù)器名,svn是代碼倉(cāng)庫(kù)的根目錄,StartKit是我們?cè)谏蟼€(gè)教程中添加的一個(gè)代碼庫(kù):
說明:左下角的CheckBox,在第一次簽入源代碼時(shí)沒有用,但是,在以后 你提交代碼的時(shí)候是非常有用的。
圖2-2-2

點(diǎn)擊OK按鈕,會(huì)彈出下面的窗體,要求輸入憑據(jù):
圖2-2-3

在上面的窗體中輸入用戶名和密碼,點(diǎn)擊OK按鈕:
圖2-2-4

如上圖所示,好了,源代碼已經(jīng)成功簽入SVN服務(wù)器了。這時(shí)候團(tuán)隊(duì)成員就可以遷出SVN服務(wù)器上的源代碼到自己的機(jī)器了。
2、簽出源代碼到本機(jī)
在本機(jī)創(chuàng)建文件夾StartKit,右鍵點(diǎn)擊Checkout,彈出如下圖的窗體:
圖2-2-5

在上圖中URL of Repository:下的文本框中輸入svn server中的代碼庫(kù)的地址,其他默認(rèn),點(diǎn)擊OK按鈕,就開始簽出源代碼了。
說明:上圖中的Checkout Depth,有4個(gè)選項(xiàng),分別是遷出全部、只簽出下一級(jí)子目錄和文件、只簽出文件、只簽出空項(xiàng)目,默認(rèn)的是第一項(xiàng)。上面的例子中,我們也可以使用web的 方式訪問代碼庫(kù),在瀏覽器中輸入http://zt.Net.henu.edu.cn/svn/StartKit/
這時(shí)候也會(huì)彈出對(duì)話框,要求輸入用戶名和密碼,通過驗(yàn)證后即可瀏覽代碼庫(kù)中的內(nèi)容。
搞定!源代碼已經(jīng)成功簽出到剛才新建的StartKit目錄中。
打開StartKit目錄,可以看到如下圖的文件夾結(jié)構(gòu):
圖2-2-5

一旦你對(duì)文件或文件夾做了任何修改,那么文件或文件夾的顯示圖片機(jī)會(huì)發(fā)生變化。下圖中我修改了其中的二個(gè)文件:
圖2-2-7

大家看一下不同狀態(tài)所對(duì)應(yīng)的圖片:
圖2-2-8

我們已經(jīng)知道怎么將源代碼簽入到SVN服務(wù)器,怎么從服務(wù)器簽出代碼到本機(jī),也簡(jiǎn)單了解了不同狀態(tài)所對(duì)應(yīng)的圖案啦。
3、提交修改過的文件到SVN服務(wù)器
上面的圖2-2-7中,我修改了位于Model文件中的二個(gè)文件ImageInfo.cs和NewsInfo.cs,下面演示如何提交到SVN服務(wù) 器。
注意:提交源代碼到服務(wù)器時(shí),一定確保本機(jī)的代碼是最新版本,否則可能提交失敗,或者造成版本沖突。
在Model文件夾上點(diǎn)擊右鍵或在Model文件下的空白處點(diǎn)擊右鍵,點(diǎn)擊SVN Commit…彈出下面的窗體:
圖2-2-9

點(diǎn)擊OK按鈕后,彈出如下圖的窗體:
圖2-2-10

4、添加新文件到SVN服務(wù)器
我們?cè)贛odel文件下添加一個(gè)新的類文件UserInfo.cs,在Model文件下的空白處點(diǎn)擊右鍵,點(diǎn)擊SVN Commit…,和上面講的提交修改過的文件到SVN服務(wù)器一樣,就可以了。
另外也可以在文件UserInfo.cs上點(diǎn)擊右鍵,點(diǎn)擊TortoiseSVN=>>Add,彈出如下圖的窗體:
圖2-2-11

選中UserInfo.cs文件,點(diǎn)擊OK按鈕,這樣并沒有將這個(gè)文件提交到SVN服務(wù)器,只是將這個(gè)文件標(biāo)記為源代碼庫(kù)庫(kù)中的文件,并將其狀態(tài)置 為修改狀態(tài)。之后,我們要再SVN Commit這個(gè)文件一次,才可以將其真正提交到SVN服務(wù)器上的代碼庫(kù)中。
上面講是添加文件,實(shí)際上,添加文件夾的步驟也是一樣的,這里就不說了。
5、更新本機(jī)代碼與SVN服務(wù)器上最新的版本一致
這個(gè)也很簡(jiǎn)單,只要在需要更新的文件夾上點(diǎn)擊右鍵或在該文件下的空白處點(diǎn)擊右鍵,點(diǎn)擊SVN Update,就可以了。
注意:更新操作可能會(huì)因?yàn)榘姹緵_突而失敗,這是可以使用合并【Merge】或其他方法解決; 也可能因?yàn)殒i定【Get Lock】而失敗,這是需要先解鎖【Release Lock】。
6、重命名文件或文件夾,并將修改提交到SVN服務(wù)器
只要在需要重命名的文件或文件夾上點(diǎn)擊右鍵,點(diǎn)擊TortiseSVN=>& gt;Rename…,在彈出的窗體中輸入新名稱,點(diǎn)擊OK按鈕,就可以了。此方法也不是直接重命名,而是將該文件或文件夾的名稱標(biāo)記為重命名后名稱,也 需要我們使用SVN Commit提交到SVN服務(wù)器后才真正重命名。
7、刪除文件或文件夾,并將修改提交到SVN服務(wù)器
最簡(jiǎn)單就是,你直接刪除文件或文件夾,然后使用SVN Commit提交更新到SVN服務(wù)器。另外一種方法是在你要?jiǎng)h除的文件或文件夾上點(diǎn)擊右鍵=>>TortoiseSVN=>> Delete刪除,此方法也不是直接刪除,而是將該文件或文件夾的狀態(tài)置為刪除,也需要我們使用SVN Commit提交到SVN服務(wù)器后才真正刪除。
說明:實(shí)際上,從你把源代碼遷簽入SVN服務(wù)器開始,每一個(gè)版本的數(shù)據(jù)和文件,就算是你已經(jīng) 刪除了的,也都可以隨時(shí)遷出。
以上只是TortoiseSVN最簡(jiǎn)單的幾個(gè)功能,其實(shí)他的功能遠(yuǎn)不止這些,其他的功能大家可以在使用的過程中慢慢體會(huì),有些功能我會(huì)在下面的教程中使用到,到時(shí)候會(huì)和大家講清楚用法。
注意:向SVN服務(wù)器提交源代碼的時(shí)候,一定不要提交bin、obj 等文件夾,否則會(huì)很麻煩。但是web項(xiàng)目的bin目錄除外,但是web項(xiàng)目的bin目錄中的引用其他項(xiàng)目而生成的dll不需要提交。
一個(gè)好習(xí)慣:如果項(xiàng)目中引用了其他的第三方的程序集,比如 EnterPRiseLibrary、FCKEditor等,這時(shí)候不要簡(jiǎn)單從他們的安裝位置引用,而是在你的解決方案下,添加一個(gè)Library的目 錄,把需要的程序集復(fù)制到這里,然后從Library目錄引用,這樣有什么好處,自己想一想吧!
Tortoise SVN 客戶端使用經(jīng)驗(yàn)小結(jié):
1. export 和check out export 下載源代碼 用法: 1、新建一個(gè)空的文件夾,右鍵點(diǎn)擊它,可以看到TortoiseSVN菜單以及上面的SVN Checkout。 2、不用管這個(gè)Checkout,我們選擇TortoiseSVN菜單下的Export...,接著它會(huì)讓你輸入url。 3、比如輸入【迷宮探寶】的SVN地址是:http://game-rts-framework.googlecode.com/svn/trunk / 4、其他選項(xiàng)不需要更改,Omit externals不要勾選,HEAD Revision選中表示最新的代碼版本,接著點(diǎn)擊OK即可將代碼導(dǎo)出到這個(gè)目錄中:) check out 意思簽出,雖然和Export的效果一樣是把代碼從服務(wù)器下載到本地,但是Checkout有驗(yàn)證的功能,Checkout到某處的代碼,將會(huì)被 TortoiseSVN監(jiān)視,里面的文件可以享受各種SVN的服務(wù)。2 .每次提交代碼需要注意哪些問題 如果你更新了目錄中的文件,提交代碼需要用到commit功能,commit的功能不僅僅是上傳,他會(huì)和服務(wù)器上面的文件進(jìn)行對(duì)比,假如你更新了某個(gè)文件而服務(wù)器上面也有人更新了這個(gè)文件,并且是在你checkout之后做的更新,那么它會(huì)嘗試將你的更新和他人的更新進(jìn)行融合(merge),假如自動(dòng) merge不成功,那么報(bào)告conflict,你必須自己來(lái)手動(dòng)merge,也就是把你的更新和別人的更新無(wú)沖突的寫在一起。commit的時(shí)候,最好填寫Log信息,這樣保證別人可以看到你的更新究竟做了寫什么。這就相當(dāng)于上傳文件并且說明自己做了那些修改,多人合作的時(shí)候log非常重要。 TortoiseSVN的commit只會(huì)上傳原先checkout然后又被修改了的文件,假如你新加入了某些文件,需要右鍵點(diǎn)擊文件選擇Add,然 后文件上面會(huì)出現(xiàn)一個(gè)加號(hào),在下次commit的時(shí)候它就會(huì)被upload并且被標(biāo)記為綠色對(duì)勾。沒有綠色對(duì)勾的文件不會(huì)被commit。假如你需要給帶有綠色對(duì)勾文件改名或者移動(dòng)它的位置,請(qǐng)不要使用windows的功能,右鍵點(diǎn)擊它們,TortoiseSVN都有相應(yīng)的操作。想象這 些文件已經(jīng)不在是你本地的東西,你的一舉一動(dòng)都必須讓Tortoise知道。假如修改了某個(gè)文件但是你后悔了,可以右鍵點(diǎn)擊它選擇Revert,它將變回上次checkout時(shí)候的情況。或者Revert整個(gè)工程到任意一個(gè)從 前的版本. 下面描述在使用Commit時(shí)的幾個(gè)注意點(diǎn): -------------如有多個(gè)文件需要同時(shí)提交,同時(shí)文件在不同的目錄下,必須找到這些文件的最短目錄上點(diǎn)擊 Commit,TortoiseSVN會(huì)搜索被點(diǎn)擊目錄以及該目錄下所有的文件,并將修改變動(dòng)的文件羅列在列表中。-------------仔細(xì)查看列表中的文件,確定哪些文件時(shí)需要更新的,如果不需要更新某個(gè)已經(jīng)變化了的文件,只需要在該文件上點(diǎn)擊右鍵,選擇 還原操作;選擇需要新增的文件,不要將臨時(shí)文件添加到版本庫(kù)中。-------------如遇到文件沖突(沖突:要提交的文件已被其他人改動(dòng)并提交到版本庫(kù)中)要啟用解決沖突功能。 3. 如何保持本地版本和服務(wù)器版本同步 使用update來(lái)同步本地和服務(wù)器上的代碼。同樣是右鍵選擇SVN update,所有的更改就會(huì)從服務(wù)器端傳到你的硬盤。注意,假如別人刪除了某個(gè)文件,那么更新之后你在本地的也會(huì)被刪除。如果本地的代碼已經(jīng)被修改,和commit一樣會(huì)先進(jìn)行merge,不成功的話就會(huì)報(bào)告conflict 4 如何在同一個(gè)在一個(gè)工程的各個(gè)分支或者主干之間切換 使用tortoise SVN-->switch 在URL中輸入branch或trunk的url地址 5.如何比較兩個(gè)版本之間的差別 本地更改 如果你想看到你的本地副本有哪些更加,只用在資源管理器中右鍵菜單下選TortoiseSVN→ 比較差異。 與另外一個(gè)分支/標(biāo)簽之間的差異 如果你想查看主干程序(假如你在分支上開發(fā))有哪些修改或者是某一分支(假如你在主干上開發(fā))有哪些修改,你可以使用右鍵菜單。在你點(diǎn)擊文件的同時(shí)按 住Shift鍵,然后選擇TortoiseSVN→ URL比較。在彈出的對(duì)話框中,將特別顯示將與你本地版本做比較的版本的URL地址。你還可以使用版本庫(kù)瀏覽器,選擇兩個(gè)目錄樹比較,也許是兩個(gè)標(biāo)記,或者是分支/標(biāo)記和最新版本。郵件菜單允許你使用比較版本來(lái)比較它們。閱讀第 5.9.2 節(jié) “比較文件夾”以便獲得更多信息。與歷史版本的比較差異 如果你想查看某一特定版本與本地拷貝之間的差異,使用顯示日志對(duì)話框,選擇要比較的版本,然后選擇在右鍵菜單中選與本地拷貝比較差異 兩個(gè)歷史版本的比較 如果你要查看任意已提交的兩個(gè)歷史版本之間的差異,在版本日志對(duì)話框中選擇你要比較的兩個(gè)版本(一般使用 Ctrl-更改),然后在右鍵菜單中選比較版本差異 如果你在文件夾的版本日志中這樣做,就會(huì)出現(xiàn)一個(gè)比較版本對(duì)話框,顯示此文件夾的文件修改列表。閱讀第 5.9.2 節(jié) “比較文件夾”以便獲得更多信息。 提交所有修改 如果你要在一個(gè)視窗中查看某一版本的所有更改,你可以使用統(tǒng)一顯示所有比較 (GNU 片段整理)。它將顯示所有修改中的部分內(nèi)容。它很難顯示一個(gè)全面清晰的比較,但是會(huì)將所有更改都集中顯示出來(lái)。在版本日志對(duì)話框中選擇某一版本,然后在右鍵菜單中選擇統(tǒng)一顯示所有比較。文件差異 如果你要查看兩個(gè)不同文件之間的差異,你可以直接在資源管理器中選擇這兩個(gè)文件(一般使用 Ctrl-modifier),然后右鍵菜單中選TortoiseSVN→ 比較差異。WC文件/文件夾與URL之間的比較差異 如果你要查看你本地拷貝中的任一文件與版本庫(kù)中任一文件之間差異, 譴責(zé)信息之間的比較差異 如果你要查看的不僅是比較差異而且包括修改該版本的作者,版本號(hào)和日期,你可以在版本日志對(duì)話框中綜合比較差異和譴責(zé)信息。這里有更多詳細(xì)介紹第 5.20.2 節(jié) “追溯不同點(diǎn)”。比較文件夾差異 TortoiseSVN 自帶的內(nèi)置工具不支持查看多級(jí)目錄之間的差異,但你可以使用支持該功能的外置工具來(lái)替代。在這里 第 5.9.4 節(jié) “其他的比較/合并工具”我們可以介紹一些我們使用過的工具。6.提交代碼時(shí)怎樣知道自己改了哪些文件,別人改了哪些文件 7. 如何知道某個(gè)文件的某一行是誰(shuí)在哪個(gè)版本修改的 8. 如何為一個(gè)SVN主工程建立分支或tag 創(chuàng)建分支使用步驟: 1、選擇你要產(chǎn)生分支的文件,點(diǎn)擊鼠標(biāo)右鍵,選擇[分支/標(biāo)記...] 2、在[至URL(T)]輸入框中將文件重命名為你的分支文件名,輸入便于區(qū)分的日志信息,點(diǎn)擊確認(rèn)。 3、在SVN倉(cāng)庫(kù)中會(huì)復(fù)制一個(gè)你所指定的文件,文件名稱就是你所命名的,但是在你的本地目錄上看不到新建的分支文件名,要使你的文件更新作用到你的分支上,你必須選擇文件,點(diǎn)擊鼠標(biāo)右鍵,選擇[切換...],選擇你重命名的文件,點(diǎn)擊確定即可。這樣你的本地文件就和分支文件關(guān)聯(lián)上了,不要奇怪,這時(shí)本地目錄上看到的文件名仍然為舊的文件名。經(jīng)驗(yàn)小結(jié): 1、如果操作的文件之前還未提交,而你又想把文件提交到新的分支上,記得一定要選擇切換 2、SVN分支的管理實(shí)際上就是把不同的分支用不同的文件保存,因此你在取得新版本的時(shí)候會(huì)發(fā)現(xiàn),不同分支的最新文件也會(huì)被獲取下來(lái)。 創(chuàng)建tag操作,相當(dāng)于把當(dāng)前的代碼版本復(fù)制一份到其他地方,然后以這個(gè)地方為出發(fā)點(diǎn)進(jìn)行新的開發(fā),與原來(lái)位置的版本互不干擾。 對(duì)于branches、tags、trunk這三個(gè)目錄,并不是subversion必需的,而是被總結(jié)的一種良好的團(tuán)隊(duì)開發(fā)習(xí)慣,其使用方法為: 1、開發(fā)者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。 2、這個(gè)主干被拷貝到“發(fā)布”分支。 當(dāng)小組認(rèn)為軟件已經(jīng)做好發(fā)布的準(zhǔn)備(如,版本1.0)然后/trunk會(huì)被拷貝到/branches/1.0。 3、項(xiàng)目組繼續(xù)并行工作,一個(gè)小組開始對(duì)分支進(jìn)行嚴(yán)酷的測(cè)試,同時(shí)另一個(gè)小組在/trunk繼續(xù)新的工作(如,準(zhǔn)備2.0),如果一個(gè)bug在任何一 個(gè)位置被發(fā)現(xiàn),錯(cuò)誤修正需要來(lái)回運(yùn)送。然而這個(gè)過程有時(shí)候也會(huì)結(jié)束,例如分支已經(jīng)為發(fā)布前的最終測(cè)試“停滯”了。4、分支已經(jīng)作了標(biāo)簽并且發(fā)布,當(dāng)測(cè)試結(jié)束,/branches/1.0作為引用快照已經(jīng)拷貝到/tags/1.0.0,這個(gè)標(biāo)簽被打包發(fā)布給客戶。 5、分支多次維護(hù)。當(dāng)繼續(xù)在/trunk上為版本2.0工作,bug修正繼續(xù)從/trunk運(yùn)送到/branches/1.0,如果積累了足夠的 bug修正,管理部門決定發(fā)布1.0.1版本:拷貝/branches/1.0到/tags/1.0.1,標(biāo)簽被打包發(fā)布。一般建立最初的repository時(shí),就建好這三個(gè)目錄,把所有代碼放入/trunk中,如:要將project1目錄下的代碼導(dǎo)入 repository,project1的結(jié)構(gòu)就是:project1/branches,project1/tags,project1 /trunk,project1/trunk/food.c,project1/trunk/egg.pc……,然后將project1目錄導(dǎo)入 repository,建立最初的資料庫(kù)。然后export回project1,作為本地工作目錄。
其他閱讀:
http://www.cnblogs.com/iprograming/archive/2012/12/15/SVN_1.html
http://www.cnblogs.com/IPrograming/archive/2012/12/15/SVN_2.html
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注