2009-04-24 來源:dev.idv.tw 數據庫
大部分的TortoiseSVN的操做都是透過檔案管理員及鼠標右鍵就能夠完成了。若是您以前使用過TortoiseCVS,應該會對這種操做方式感到十分親切。 安全
有一個簡單但不十分精確比喻: 服務器
SVN = 版本控制 + 備份服務器
簡單的說,您能夠把SVN當成您的備份服務器,更好的是,他能夠幫您記住每次上傳到這個服務器的檔案內容。而且自動的賦予每次的變動一個版本。 ssh
一般,咱們稱用來存放上傳檔案的地方就作Repository。用中文來講,有點像是檔案倉庫的意思。不過,一般咱們仍是使用Repository這個名詞。基本上,第一次咱們須要有一個新增(add)檔案的動做,將想要備份的檔案放到Repository上面。往後,當您有任何修改時,均可以上傳到 Repository上面,上傳已經存在且修改過的檔案就叫作commit,也就是提交修改給SVN server的意思。針對每次的commit,SVN server都會賦予他一個新的版本。同時,也會把每次上傳的時間記錄下來。往後,由於某些因素,若是您須要從Repository下載曾經提交的檔案。您能夠直接選擇取得最新的版本,也能夠取得任何一個以前的版本。若是忘記了版本,仍是能夠靠記憶嘗試取得某個日期的版本。 svn
SVN能幫咱們解決上面的問題嗎?答案是確定的: post
假設您已經安裝前面所說起的TortoiseSVN這套軟件,如今咱們先告訴您如何用本身的硬盤或是隨身碟看成SVN Repository的存放地點。若是您只想知道如何存取一個已經創建好的SVN Server上面的Repository,請直接跳過本節。 加密
假設您的要放置Repository的地方是E槽。您須要先創建一個空的目錄。如下面的例子而言,咱們在E槽下面創建了一個名爲svn_repo的目錄。 SVN並無限定Repository目錄名稱。您能夠創建任何您本身喜歡的名稱。可是,強烈建議勿使用非英文的檔名(如中文或日文)。 spa
透過您的檔案管理員,在E:\svn_repo的Icon上面,按下鼠標右鍵後,選擇TortoiseSVN->Create repository here。 操作系統
接着,您會看到以下的一個窗口,這個窗口主要是問您,您但願使用的Repository數據庫格式是FSFS仍是BDB。基本上,請選擇FSFS就能夠了。按下OK按鈕後,您將能夠看到下一個畫面。 .net
這就表示您的SVN repository已經成功的創建了。接下來就是要把您的檔案備份進來。往後,只要須要使用這個repository,咱們就可使用 file:///E:/SVN_REPO表示它。SVN就是透過這種URL的方式到如何與Repository取得聯繫。各類URL的格式以下:
file:///磁盤驅動器|/repository所在目錄/子目錄 http://帳號@服務器名稱/ repository所在目錄/子目錄 https://帳號@服務器名稱/ repository所在目錄/子目錄 svn+ssh://帳號@服務器名稱/ repository所在目錄/子目錄
其中,http表示使用通常的超文字傳輸通信協議。https表示使用加密的超文字傳輸通信協議。svn+ssh表示透過SSH加密通信的管道,進行存取。
所謂的Working目錄其實就是您日常用來存放工做檔案的地方。一般咱們會等到本身的工做作的一個段落的時候再進行備份。因此咱們日常都是在 Working目錄下面工做,等到適當時機在commit到repository中。舉例來講,咱們想在D槽下面創建一個名爲working的目錄。首先先把這個目錄創建出來。
此時,這個目錄應該爲空的。
在檔案管理員中按下右鍵後(您能夠在working目錄的icon上按,也可進入working目錄後,在空白的地方按),選擇SVN checkout。
接着您能夠看到以下的畫面:
首先咱們要填入的是repository的位置,對於SVN來講,repository的位置都是URL。因爲咱們前面已經在E槽創建一個repository,所以,咱們如今要在URL of repository這一欄填入file:///E:/svn_repo/。
接着,稍微看一下Checkout directory,這個字段應該要指向您的working目錄。確認後,按下OK按鈕,您應該能夠看到以下的訊息窗口。
這樣就表示動做完成。按下OK按鈕後,再到您剛剛創建的目錄下。您將會看到working目錄下面多了一個名爲.svn的目錄(這個目錄是隱藏的,若是您的檔案管理員沒有設定能夠看到隱藏目錄,您將沒法看到它) 。
SVN會在您的工做目錄下,以及其子目錄下創建這個.svn的子目錄。您不該該進去這個目錄,尤爲不該該更動這個目錄下面的任何內容。不然會極可能會形成SVN沒法正常運做。
因爲,原來的repository是空的,因此咱們如今的working目錄也是空的。若是您如今checkout的是一個已經有內容的repository,您將會看到working目錄下面如今多了許多目錄及檔案。
若是您要在一個已經存在的SVN Server上面checkout出上面的檔案,您只須要給定正確的URL以及working目錄的名稱。就能夠取得指定的檔案及目錄了。
假設您前面的動做都無誤。如今您開始開發一個新的程序。假設您開發的程序將放在前面創建的working目錄下面的my_ prj子目錄。以下所示:
假設您已經編輯好檔案,準備把他們放到SVN的repository中。您須要在my_prj目錄的icon上面,按鼠標右鍵,而且選擇TortoiseSVN->Add:
接着,TortoiseSVN會把準備要加入的檔案及目錄,顯示給您看。打勾的就是等下要被加入到Repository中的。若是您有某些檔案或是目錄不想在此次加入,您可讓該項目不要被勾選。如此,它就不會被加入到Repository去。
按下OK後,您將會看到以下的訊息窗口:
這樣就表示成功了。有一點要注意的是,這個Add的動做並未真正的將檔案放到Repository中。僅僅是告知SVN準備要在Repository中放入這些檔案。此時,若是您透過檔案管理員查看這些檔案,應該會看到一個白色紅底的驚歎號在檔案icon的下方。
這是表示您的working目錄中的檔案與Repository中的檔案尚未同步。如今咱們要多一個commit的動做。讓這些檔案真正的放入到 Repository中。您能夠在my_prj目錄的icon上或者是my_prj目錄內的空白處按下鼠標右鍵,叫出以下的選單,而且選擇SVN commit。
緊接着,您將會看到以下的窗口出現:
在這個窗口中,下半部會列出一個清單,讓您清楚的瞭解到哪些檔案要被commit到repository中。一樣的,若是您有檔案不想在這個時候commit到Repository,您能夠取消選取的檔案,這樣他們就不會被commit到Repository中。
在檔案列表的上方是Message欄,您能夠在欄中輸入本次commit的目的。這是十分重要的字段,當您commit的次數不少時,能夠靠這個訊息知道版本與版本之間的差別。當您輸入好Message,按下OK以後,就能夠看到以下的窗口出現,通知您已經將指定的檔案送到Repository中。
您能夠到先前的folder中,肯定是否全部的檔案icon都有以下的綠色勾勾在上面,這樣表明您的檔案都正確無誤的到repository中。
有時候,由於Windows自己的問題,您可能會看到有些icon沒有變成綠色的勾勾。此時,多按F5幾回,應該就能夠解決這個問題。若是,仍然不行,表示您以前的commit動做真的有問題。請仔細檢查以前的commit動做是否正確。
爲什麼須要更新?因爲版本控制系統多半都是由許多人共同使用。因此,一樣的檔案可能還有人會去進行編輯。爲了確保您工做目錄中的檔案與Repository中的檔案是同步的。建議您在編輯前都先進行更新的動做。在此,咱們都先假設您已經將檔案check out過一次。如今要說明的是如何在一個check out過的目錄進行update。在想要更新的檔案或目錄icon上面按下鼠標右鍵。而且選擇SVN Update。
正常的情況下,您能夠看到如上的窗口。在這個窗口中會顯示有哪些文件更新了。若是沒有看到檔案更新的相關信息,這表示您的目錄中的檔案已是最新的,因此無須進行更新。
有時咱們須要回溯至特定的日期或是版本,這時就能夠利用SVN的Update to revision的功能。在想要更新的檔案或目錄icon上面按下鼠標右鍵。而且選擇TortoiseSVN->Update to revision。
在這個Update窗口中,您能夠選擇更新到最新版本(HEAD)。也能夠選擇更新到某個指定的版本(Revision)。固然,您可能早就記不起來正確的版本號碼。可能只隱約的記得大概在什麼時間。不要緊,按下Show log按鈕,您就能夠回顧歷史了。
全部您曾經作過的動做,及其日期與對應的版本都會列在這個窗口上面,只要在你想要的版上面點一下,讓他變成反白,而後按下OK。這個版本就會自動填入Update窗口中的Revision字段中。您只要再按下一次OK,這個版本就會被取出來到您的硬盤中。
不少時候您會但願有另一個複製的目錄來進行新的編修。等到肯定這個分支的修改已經完畢了,再合併到原來的主要開發版本上。舉例來講,咱們目前在working copy下面有以下的目錄及檔案:
如今,咱們要爲trunk這個目錄創建一個branch。假設咱們但願這個目錄是在D:\working\my_prj\branch \my_new_branch_for_testing。首先咱們能夠在trunk目錄下面的空白處,或是直接在trunk的icon下面按下鼠標右鍵。
在選擇Branch/Tag…這個項目後,您將會看到以下的對話框出現。
請先確認From WC at URL: 中的目錄是您要複製的來源目錄。接着,在To URL中輸入您要複製過去的路徑。一般咱們會將全部的branch集中在一個目錄下面。以上面的例子來講,branch檔案都會集中在branch的子目錄下面。在To URL中您只須要輸入您要的目錄便可。目錄不存在時,會由SVN幫您創建。特別須要注意的是SVN由於斜線做爲目錄分隔字符,而非反斜線。
接着在Log message輸入您這次branch的目的爲什麼。按下OK就能夠了。
若是成功,將能夠看到下面的畫面:
按下OK就能夠關閉這個窗口了。若是您此時馬上去working copy的branch子目錄下面,您將會失望的發如今該目錄下面並無剛剛指定的目錄存在。這是由於您working copy的部份仍是舊的,您只須要在branch子目錄下面進行SVN update就能夠看到這個新增的目錄了。新增的目錄就與原來的目錄無關了。您能夠任意對他進行編輯,一直到您確認好全部在branch下面該作的工做都完成後,您能夠選擇將這個branch merge回原來的trunk目錄,或者是保留它在branch中。
要merge回trunk目錄中,方法很簡單。以上面的例子來講,咱們在D:\working\my_prj\trunk目錄空白處,按下鼠標右鍵,選擇Merge:
接着能夠看到以下的畫面:
這個畫面主要分爲三個部份,前面的From: 與 To: 是要問您打算從Branch中的哪一個版本到哪一個版本,merge回原來的trunk目錄中。所以,From跟To的URL字段應當都是指定原來 branch的目錄下。剩下的就是指定要merge的revision範圍。以上面的例子而言,咱們從Branch的Revision 7開始merge到Branch下面的最新版本。您能夠透過,Dry run按鈕,試做一次Merge。這個merge只會顯示一些訊息,不會真正的更新到trunk的目錄去。只有按下Merge按鈕後,纔會真正的將 branch的檔案與trunk的檔案合併起來。
上面的訊息告訴咱們在trunk目錄下面的yyyy.cpp及xxx1.cpp已經被更改過了。若是您在如今到trunk目錄下,會看到這兩個檔案處於被修改的狀態。
若是您確認此次的merge沒有問題,您能夠直接使用commit來將這兩個被修改的檔案commit回SVN repository上。若是有問題,您能夠直接修改這兩個檔案,直到確認ok了,再行commit。
一切順利的話,您就成功的將branch的檔案merge回trunk了。
所謂的Tag或是Release就是一個特別的版本,由於這個版本可能有特別的意義。例如:這個版本是特別的Milestone或是release給客戶的版本。其實,Tag與Release的做法與Branch徹底相同。只是Branch可能會須要merge回原來的trunk中,而tag及 release大部分都不須要merge回trunk中。舉例來講,今天咱們的trunk作了一版,這個版本被認定是軟件的1.0版。1.0版對於開發來講是一個很是重要的里程碑。因此咱們要特別爲他作一個標記,亦即Tag。假設,這個 1.0版是要正式release給客戶或是相關vendor,咱們要能夠爲他作一個Release的標記。基本上,SVN只有目錄的概念,並無什麼 Tag的用法。因此您會看到再SVN的選單上面,Branch與Tag是同一個項目。以這個1.0的例子來講,咱們就是在Trunk上面,按下鼠標右鍵,選擇Branch/Tag的項目:
成功的話,您就在Tag目錄下面創建了一個1.0的目錄。固然,若是您這時到Tag的目錄下面去,會看不到這個目錄,您須要在Tag目錄下面update一下,才能看到它。
製做Release的做法與Tag徹底相同。只是把Tag的目錄換成Release而已。
看到這裏,相信你們都已經領悟到不管是Branch,Tag或是Release都只是將指定的 Trunk版本複製一份到另一個目錄去。至於這個目錄要叫Branch仍是叫Release,SVN根本就無論。因此,您也可取其它的目錄名稱。不過,Branch,Tag及Release已是SVN上面約定成俗的名稱。因此,除非您知道本身爲什麼這樣作,不然,最好仍是follow這個命名原則,以避免後面新加入的人看不懂。
NOTE:一樣的道理Trunk也只是一個約定成俗的名稱。不必定要叫Trunk。只是你們看到Trunk目錄就會知道這裏面放的是主要的開發主幹。
前面寫了很多廢話,主要是給徹底沒有版本控制觀念的人看的。若是你想直接知道某個功能如何使用,請看下面的章節。
在後面的說明,皆以d:\working看成工做目錄。您能夠將他換成其它任何您想要的目錄。
NOTE:新增的檔案要通過提交(Commit)的動做纔回真正的放入Repository中。