這兩篇文章(http://www.linuxidc.com/Linux/2011-08/40592.htm 與 http://www.linuxidc.com/Linux/2011-08/40593.htm)在Ubuntu和RedHat 5.5上搭建好了svnserve環境,下面總結一下svn的具體使用流程。
服務器的搭建
1)建立代碼庫。
#svnadmin create /srv/svn/repos/myproject
2)修改配置文件svnserve.conf
anon_access = none
auth_access = write
password_db = passwd 其中passwd是一個文件,默認是當前文件夾下的passwd,如果要用其他的passwd需要制定路徑名
3)配置passwd文件
添加用戶名和密碼: cobing = 123
4)啟動svnserve服務
#svnserve -d -T -r /srv/svn/repos
-d 表示把進程svnserve作為守護進程在後台運行
-T 表示用多線程的方式處理數據
-r 可以有效地改變文件系統的根位置,客戶端可以使用去掉前半部分的路徑,留下的要短一些的
要想讓svnserve在系統啟動時自動啟動,需要把它添加到/etc/rc.local文件中
客戶端
1)將本地代碼導入到svn代碼庫中
#svn import test svn://192.168.146.128/myproject
注意:當初建立代碼庫的路徑時/srv/svn/repos/myproject,我們啟動svn服務器指定的根目錄是/srv/svn/repos,而現在客戶導入代碼的目錄是/myproject。因為svnserve指定了根目錄,所以用戶在訪問192.168.146.128是就相當於在訪問服務器的/srv/svn/repos目錄,所以這個時候我們只需要指出myproject目錄即可。這個地方很容易出錯,多家防范,我掉進去摸索了好久才出來。
2)代碼導入SVN代碼庫中以後,其他用戶就可以從代碼庫下載代碼進行修改了,這個操作由svn checkout 完成
# svn checkout svn://192.168.146.128/myproject
checkout之後,svn會在你的當前目錄下生成一個myproject的文件夾,這個文件夾就是你將來進行各種操作、與svn服務器交互的地方
3)之後就可以coding了,但是要注意:每次對myproject下文件的添加、刪除、移動、復制操作都要告訴svn:
a, 增加文件、目錄 #svn add 文件或目錄名
b,刪除文件、目錄 #svn delete 文件或目錄名
c, 拷貝文件、目錄 #svn copy 條目名1 條目名2
d, 拷貝條目並刪除原條目 #svn move 條目名1 條目名2
svn項目本身已經存在的文件只需要對其修改即可,svn會自動檢測到修改。
4)修改完文件後不能馬上提交,還有很多工作要做:
a, 檢驗修改
當你完成修改,你需要提交他們到版本庫,但是在此之前,檢查一下做過什麼修改是個好主意,通過提交前的檢查,你可以整理一份精確的日志信息,你也可以發現你不小心修改的文件,給了你一次恢復修改的機會。此外,這是一個審查和仔細察看修改的好機會,你可通過命令svn status浏覽所做的修改,通過svn diff檢查修改的詳細信息。
# svn status 會檢測你做的所有文件和目錄的修改
A item
預定加入到版本庫的文件、目錄或符號鏈的item。
C item
文件item發生沖突,在從服務器更新時與本地版本發生交迭,在你提交到版本庫前,必須手工的解決沖突。
D item
文件、目錄或是符號鏈item預定從版本庫中刪除。
M item
文件item的內容被修改了。
#svn diff 會精確地檢測到你做的修改
b, 取消本地修改
假定我們在看svn diff的輸出,你發現對某個文件的所有修改都是錯誤的,或許你根本不應該修改這個文件,或者是從開頭重新修改會更加容易。
#svn revert 文件名
c,手動解決沖突,把由沖突的文件手動改過來
d, 接著用svn update查看本地版本與服務器版本由什麼區別:
#svn update
這時有三個標示:
U : 表示本地沒有修改
G: 表示本地已經修改,但是與版本庫沒有重疊的地方,可以合並
C: 服務器上的改動同本地的改動沖突了,需要手動解決沖突或者用svn revert 放棄本地修改
4)At Last,您的修改結束了,並且與服務器上的版本沒有沖突,那就提交吧!
#svn commit -m "LOGMSG"
不知道你們看到這裡有沒有疑惑?是不是在想svn update 和 svn status 到底什麼區別,不都是檢驗修改麼?仔細翻翻svn用戶手冊就會發現,svn revert , svn status 和svn diff這三個命令在沒有連接svn服務器的時候也可以進行,為什麼呢?細心的用戶或者在windows上用過svn的用戶就會發現,當前工作的svn文件夾裡有一個./svn的文件,官方文檔是這樣說的“Subversion通過在.svn管理區域使用原始的版本緩存來做到這一點,這使得報告和恢復本地修改而不必訪問網絡,這個緩存(叫做“text-base”)也允許Subversion可以根據原始版本生成一個壓縮的增量(“區別”) 提交—即使你有個非常快的網絡,有這樣一個緩存有極大的好處,只向服務器提交修改的部分而不是整個文件”。也許你已經明白了,是的,svn status是本地修改與.svn中的數據對比,而svn update是本地修改與服務器數據對比。兩者的沖突是不一樣的,svn status下的沖突是你跟之前checkout時服務器數據沖突,svn update下的沖突是當前時刻與服務器數據沖突。
以上操作均在redhat 5.5上測試通過。
更高級的操作請查看用戶手冊,多看看,有益無害。