5/05/2012

版本控制 using SVN

當檔案一多,各式各樣的修改和增加功能的動作也愈多,就會自然的需要管理Version的工具
這些工具就叫作version control system
之前用過VSS (Visual SourceSafe)
這次使用的是SVN (Apache Subversion)
常見的CVS (Concurrent Versions System)也是這樣的工具。SVN最初的構想即是發展成一個可取代CVS的version control system,而且是FREE的。


版本控制的立意滿好理解的。
不外乎就是因為人多手雜,因此需要有一人、一個地方、或在這裡可以說是一樣工具,去管理這樣的場面,避免發生慘絕人寰的命案。


首先先了解你是在Trunk還是在Branch?
雖然聽說Alice's adventure in Wonderland裡的精靈曾經告訴Alice說「如果妳不知道妳要去哪裡,那麼現在你在哪裡一點都不重要。」我還是覺得若能更清楚現在的情況,還是對將要去哪裡有
幫助的。

Trunk                    //主幹,也就是你這堆東西develope的主幹
Branches               //分支,從主幹而來的,可能加上或砍掉一
                                些東西,另外修改了某些功能
   svn copy http://svnserver/calc/trunk http://svnserver/calc/branches/my-calc-branch -m 'create a branch'  
另外,可利用Tag來保存Release的史料


事情的發展上基本上是這樣:

Svnadmin create    //SVN manager set Reposity,並在這裡設置使用者帳密、權限
SVN import          //import專案資料夾進Reposity,主要用意在建立結構
  svn import project_directory http://DOMAIN/svn_project
  svn import project_directory file:///SVN_PATH/svn_project


Svn checkout(co)        //check out the source you need from Reposity
  svn co http://SVN_PATH/svn_project
  svn co file:///SVN_PATH/svn_project
  svn co -r 7 file:///var/lib/svn/dev/projects           //指要第七版



Svn update(up)          //確保自己working base端source的更新正確性
  SVN_CHECKOUT_DIR$ svn up

svn add
  SVN_CHECKOUT_DIR$ svn add filename 或 svn add directory
svn delete
svn copy
svn move

Svn status(st)            //查看己方檔案/結構 跟線上SVN的差異
  SVN_CHECKOUT_DIR$ svn st


Svn diff                   //查看檔案內容跟線上SVN的差異
  svn diff #       //compare with previous version
  svn diff -r9237:9238      //compare with pointed version


Svn commit(ci)          //覆蓋回SVN上現在的版本,版本更新
  SVN_CHECKOUT_DIR$ svn ci


Svn revert                 //還原到SVN上最新的版本
  SVN_CHECKOUT_DIR$  svn revert [file | directory]


Conflict
進行以上動作時,難免會遇到Conflict(衝突),也就是可能有兩人(以上)同時對檔進行修改,而SVN並無法決定該更新哪一部份,這時就得靠人把這些檔案做一個確定性的合併(Merge),繳回(Commit)統一後的版本給線上SVN。


處理Merge這樣的工作你可以使用多種Merge的工具去處理,必須注意的是,這樣的情形必須「用 resolved  將自動產生的檔案刪除, 才能正常 commit」
    svn resolved filename            //刪除自動產生的diff檔案 
                                                            ex: .r9366, .r9367, .mine


其他command,詳細可參考這裡


另外,請注意由於你使用的SVN可能是來自於非Subversion所release的工具,因此還是得去下載CollabNet Subversion(建議)。比如當你發現你的電腦告訴你svn並非你的內部或外部指令時..(這當然就是抓command line那個啦~)






以上內容參考自

SVN 基本指令教學@Tsung's Blog

Version Control with Subversion PDF - 作者: 邱茂森

Version control with Subversion