版本控制工具 SVN – 常用的基本指令 / 狀態表示

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:
  • 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

發表迴響