1. 程式人生 > >SVN switch 用法詳解

SVN switch 用法詳解

一直知道SVN有個switch命令,但是對它的介紹教程卻很少,大多是生硬的svn幫助文件裡的文字,從而一直不怎麼會用。今天看了這篇文章,突覺豁然開朗,整理下來以備查閱。

使用SVN,自然是需要與別人合作開發才能體現出作用。兩個人如果都在trunk上工作,那麼每次提交時都要保證程式碼的正確性,否則自己提交一個bug百出的版本,對方一更新就掛了,所以提交時都要很謹慎。但我覺得應該有人會像我一樣有這樣的強迫症,檔案做點小修改就想提交到伺服器上去,唯恐自己將來哪裡修改失敗而萬劫不復。抑或為了備份考慮或者有事離開,也常常把寫的不完整的程式提交上去。因此,每個人建一個branch,在自己的branch上修改,再把修改merge進trunk裡是個正確選擇。

之前不瞭解switch的用法,導致導致建的branch完全沒有個branch的樣子,基本和trunk平起平坐了。自己修改了內容,想要提交到trunk中,怎麼做呢?恩,先把work copy提交到branch中;把trunk中現在的內容merge進work copy中(別人可能已經更新了trunk),然後再提交到branch中。然後把當前的work copy switch到 trunk(以前以為swith是這麼用的!),把branch的內容merge到work copy中,然後把work copy提交到版本庫中。為了把branch提交到trunk中,居然需要三次提交,這完全是在操作兩個完全獨立的版本庫嘛,根本沒有什麼邏輯上的聯絡!

現在終於要進入主題,講講switch究竟是怎麼用的了。

根據官方幫助文件,switch的作用是 把工作拷貝更新到別的URL。下面的例子也講的不是很明白,導致我一直以為switch就是你可以在一個資料夾裡管理兩個branch,來回切換就行了,不需要新建兩個資料夾,從而節省你的硬碟空間!現在通過我上面提到的那篇文章才明白,原來:一個work copy裡的資料夾,可以來自不同的版本庫;資料夾裡的每一個檔案,可以受到不同版本庫的控制!

什麼意思?ok,讓我們來親自實踐一下。

首先建立一個測試資料夾

把trunk checkout 到本地,不妨命名為me

然後再checkout出來一遍,命名為other

相當於我們有兩個本地副本在工作。

在me裡,我們建兩個檔案,a.txt(內容Hello world!),b.txt(內容Good morning!)把me提交上去。然後為a.txt建立一個branch,就放到branch下面稱為a.me.txt吧。

最終我們的版本庫是這個樣子:

回到本地,在me檔案夾了,我們對a.txt進行switch,選擇branch裡的那個檔案,這樣,a.txt本身名字沒有變,只是指向了版本庫中branch的那個檔案了。

ok,我們對它做點修改,

提交上去,我們更新一下other,看看a.txt,會發現內容卻是保持著最早的版本,剛才我們的提交卻是是修改了branch而沒有改變trunk。

我們以other的身份修改b.txt

提交然後更新me,就會發現b.txt確實受到了全域性的改變。

好,下面我們就要把剛才對a.txt提交到全域性了。這個其實就很簡單了,把a.txt switch回trunk,merge的時候選擇Reintegrate a branch,來源選擇branch裡的那個檔案就好了。最後不要忘了提交。

這時候更新一下other,就會發現 a.txt 的變化了

這差不多就把switch的用法徹底理明白了。switch是把工作空間裡的一些檔案、資料夾交給另一個版本庫來控制,讓你在一個版本庫中工作的時候隨時接受別人在另一個版本庫對其他檔案的更新。因此,你就可以完全自在的編輯自己的branch,只要update就可以獲取trunk的更新(當然,trunk裡別人對你switch走的檔案的修改你是無法更新的,等你下次要merge是會產生conflict),因此brach和trunk的邏輯關係就是branch跟著trunk更新,trunk通過branch的merge而不斷完善。

當然了,如果你對一個資料夾裡德很多檔案進行switch,就會很難分辨出那些檔案都是受哪個版本庫的控制(需要每個檔案單獨查詢),因此一定要小心別產生混亂呦。