SVN 是一個軟體協同開發時的版本控制工具, 之前比較常用的git, 最近手上案子滿多是用SVN, 也是一個很熱門的版本控制。
Windows平台上安裝SVN Server 常見的五種方式:
SVN服務端subversion服務器程序在windows下共有5個下載版本,分別是:Collabnet,SlikSVN,VisualSVN,WANdisco,Win32Svn。(參考)
其中,
- * CollabNet是功能最強大的,因為svn的創始者就是CollabNet,不過這個版本因為功能最多,所以整個軟件包含也是最臃的,安裝包就有100多M,而且因為是運行在JAVA平台上 ,要佔用很大的內存資源;
- * SlikSVN和Win32Svn這兩個基本一樣,都只有svn的內核,沒有界面,也就是使用的時候只能用命令行操作。這兩個稍微有些區別,比如win32Svn了和apache的庫文件,而slikSVN沒有 ;
- * VisualSVN是最傻瓜似的svn,安裝和配置都有圖形界面,操作起來很方便;
可以使用collabNet,服務端是可視化的,比較方便
首先, 說明 Trunk、Tags、Branches 的差別
Trunk : 主要開發
Tags : 當要 Release 時,就標個Tag。
Branches : 當要加新功能,或是Bug fix時,將 Trunk 複制一份到 Branches 再繼續開發,之後再 Merge 回Trunk
而以上三個目錄, 不是憑空生出來的! 有兩種方式可以建立:
1. 自己手動建立 (參考)
$ mkdir MyProject
$ mkdir MyProject/trunk
$ mkdir MyProject/branches
$ mkdir MyProject/tags
svn import MyProject svn://server_address/svn_path/repository/MyProject -m “info”
2. 透過TortoiseSVN 建立 (參考1, 參考2: 用tortoiseSVN比較tags之間差異)
預設的floder stucture 就是有 trunk, branches, tags目錄
然後, 要知道常用 SVN 的指令
- checkout (co) : 將SVN上的資料checkout出來
svn checkout svn+ssh://trac.net/home/svn/repos/branches/life
svn co http://SVN_PATH/svn_project
svn co file:///SVN_PATH/svn_project
svn co -r 12 file:///var/lib/svn/dev/projects # 出第12版的 projcets code - update (up) : 更新為SVN上的最新版本
svn up - commit (ci) : 將目前有修改的 commit 到 SVN
svn ci (全部有修改的都會commit)
svn ci file1 file2 file3 (只將file1 2 3 commit) - add : 將檔案或目錄加進 SVN ,之後還要再 commit 才會真的加進 SVN
svn add file
svn add folder - del, rm : 將檔案或目錄刪除,之後還要再 commit 才會真的從 SVN 刪除
svn del file 或 svn rm file
svn del folder 或 svn rm folder - mv : 改檔名,但之前的紀錄還是會繼續保留
svn mv old_file new_file - status (st) : 從上次up後,看目前檔案/結構 跟 SVN 線上的版本有哪些不同
svn st - revert : 還原成前一個版本的狀態
svn revert file
svn revert folder
svn revert *
SVN_CHECKOUT_DIR$ svn revert [file | directory] - info : 顯示 SVN 的資訊, 以及trunk/tags/branches目前處於何處的資訊
ex:C:\svn\respoity> svn infoPath: .Working Copy Root Path: C:\svn\client\respoity <=可知道目前處於哪裡 trunk/tags/branchesURL: file:///C:/svn/respoityRelative URL: ^/Repository Root: file:///C:/svn/respoityRepository UUID: xxxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxxRevision: 10Node Kind: directorySchedule: normalLast Changed Author: YOUR_NAMELast Changed Rev: 10Last Changed Date: 2015-06-11 14:43:20
- resolved : 如果檔案有conflict,處理完後,要resolved,才可以ci
svn resolved file - diff : 將現在的檔案跟SVN做比較
svn diff (比對全部)
svn diff file
svn diff folder
svn diff -r 100:101 也可以 101:100 - export : 將SVN上的資料export出來,不包含.svn
svn export svn+ssh://trac.net/home/svn/repos/branches/life - copy (cp) : 首先是建立一個Branch的方式。
EX:用 trunk/life 建一份branch 到 branches/life
svn cp svn+ssh://trac.net/svn/trunk/life svn+ssh://trac.net/svn/branches/life -m ‘create branch’ - import : 將整個資料匣,加到SVN中。
EX:將life資料匣,import到SVN的trunk/life
svn import life svn+ssh://chingwei@trac.net/svn/trunk/life
EX:
svn import project_directory http://DOMAIN/svn_project
svn import project_directory file:///SVN_PATH/svn_project - log : 如果沒輸入參數, 預設會把所有 commit log 都列出來
svn log
svn log -l 10 # 顯示 10 筆(最新 10筆 Log)
svn log -c 100 # 顯示 revision 100 的 Logsvn log -v -c 100 # 顯示 revision 100 的詳細 Log - lock : 鎖定,這樣別人就沒辦法改了
svn lock file - unlock : 解除鎖定
svn unlock file - List: (list 可簡寫成 ls), 看上面有哪些檔案/資料c
svn ls http://SVN_PATH/svn_project
svn ls file:///SVN_PATH/svn_project - svn cleanup — 遞歸清理工作副本。刪除未完成的工作副本鎖定,並恢復未完成的操作
$ svn cleanup
$ svn cleanup /path/to/working-copy
每列前面的大寫字母表示: SVN 狀態
? – 是新的檔案,不在SVN裡
A – 新增的檔案
C – 檔案跟SVN的不同,合併失敗,要手動處理
D – 移除的檔案
M – 有修改過
U – 有更新
G – 跟SVN上的檔案不同,但合併成功。
如何取消(退回)對程式碼的修改 ?
第一種情況:改動沒有被提交(commit)。
這種情況下,使用svn revert就能取消之前的修改。
svn revert用法如下:
- # svn revert [-R] something
其中something可以是(目錄或文件的)相對路徑也可以是絕對路徑。
當something為單個文件時,直接svn revert something就行了;當something為目錄時,需要加上參數-R(Recursive,遞歸),否則只會將something這個目錄的改動。
在這種情況下也可以使用svn update命令來取消對之前的修改,但不建議使用。因為svn update會去連接倉庫服務器,耗費時間。
注意:svn revert本身有固有的危險,因為它的目的是放棄未提交的修改。一旦你選擇了恢復,Subversion沒有方法找回未提交的修改。
第二種情況:改動已經被提交(commit)。
這種情況下,用svn merge命令來進行回滾。
回滾的操作過程如下:
- 1、保證我們拿到的是最新代碼:
svn update
假設最新版本號是28。 - 2、然後找出要回滾的確切版本號:
svn log [something]
假設根據svn log日志查出要回滾的版本號是25,此處的something可以是文件、目錄或整個項目
如果想要更詳細的了解情況,可以使用svn diff -r 28:25 [something] - 3、回滾到版本號25:
svn merge -r 28:25 something
為了保險起見,再次確認回滾的結果:
svn diff [something]
發現正確無誤,提交。 - 4、提交回滾:
svn commit -m “Revert revision from r28 to r25,because of …”
提交後版本變成了29。 - 將以上操作總結為三條如下:
1. svn update,svn log,找到最新版本(latest revision)
2. 找到自己想要回滾的版本號(rollbak revision)
3. 用svn merge來回滾: svn merge -r : something