SVN 基本指令教學

SVN 的基本指令介紹, 主要參考自下述:

主要 SubTrain 的 PPT 前面頁數看一看, 基礎就大概都知道了, 後面頁數太進階了, 目前用不到, 以後再看. XD

PS: 如果不知道 SVN 是什麼, 可見此文: 淺談版本控制系統, 裡面連結檔案看完, 應該就很清楚了 :)

先來看 SVN Trunk/Tags/Branches 目錄 的 架構 和 用途:(英文說明轉載自 SubTrain PPT)

  • trunk: Main line of development(主幹, 主要開發都由在 trunk)
  • tags: Releases (想要 Release 的時後, 就標個 Tag, 以後可以依 Tag 來找回之前版本的資料)
  • branches: Preparation of release, bug fixing(分支, 可以將某些功能切出來, 或者 bug fix 等切成分支, 等做完後再用 Merge 合併回來)

SVN 基本功能:

Import: 將整個 project_directory 的資料 import 進 svn 裡面

  • svn import project_directory http://DOMAIN/svn_project
  • svn import project_directory file:///SVN_PATH/svn_project

Checkout: (checkout 可簡寫成 co), 將資料 checkout 回來

  • 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

List: (list 可簡寫成 ls), 看上面有哪些檔案/資料

  • svn ls http://SVN_PATH/svn_project
  • svn ls file:///SVN_PATH/svn_project

Update: (update 可簡寫成 up), 將目前資訊更新成 SVN 線上最新版本.

  • SVN_CHECKOUT_DIR$ svn up

Commit: (commit 可簡寫成 ci), 將目前所做的修改 commit 回 svn

  • SVN_CHECKOUT_DIR$ svn ci

Status: (status 可簡寫成 st), 看目前檔案/結構 跟 SVN 線上的版本有哪些不同

  • SVN_CHECKOUT_DIR$ svn st

Add: 將此 檔案/目錄 新增進 svn

  • SVN_CHECKOUT_DIR$ svn add filename 或 svn add directory

MV: 改檔名, 並且此檔案之前紀錄還要繼續留下

  • SVN_CHECKOUT_DIR$ svn mv filename new_filename

Revert: 還原這次的修改, 回到前一版的檔案狀態(未 commit 前可用)

  • SVN_CHECKOUT_DIR$  svn revert [file | directory]

SVN 檔案狀態資訊:

  • ?: 此檔案不存在 SVN 裡面
  • A: 此次新增的檔案
  • C: 此檔案已經有人改過, 合併不成功, 需要人工介入
  • D: 此次移除的檔案
  • M: 此檔案有修改過
  • U: 此檔案有被更新過

再來是比較進階一點點, 下述範例轉載自 SubTrain 的教學 PPT:

建立一個 branch

  • svn copy http://svnserver/calc/trunk http://svnserver/calc/branches/my-calc-branch -m 'create a branch' 

建立 Release Tags:

  • svn copy http://svnserver/calc/trunk http://svnserver/calc/tags/Release-1.0.0 -m 'create Release tags for Release 1.0.0'

合併兩個版本的檔案 # 參考自: 用 Subversion 的 Merge 來 Undo

  • svn merge -r REV1:REV2 {path/to/workingcopy}
  •  (UNDO) svn merge -r 1234:1233 ...
  •  (MERGE)svn merge -r 1233:1234 ...
  • svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk

有 "C" 狀態處理完後, 用 resolved  將自動產生的檔案刪除, 才能正常 commit:

  • svn resolved filename # 這樣子下就會把自動產生 diff 等的檔案刪除

找版本間有什麼不同 diff:

  • svn diff # 自動以現在檔案跟 SVN 內最新版做 diff
  • svn diff -r9237:9238

Info: 列出現在路徑, 版本編號, 最後一次修改日期 ... 等資訊

  • svn info

Log: 如果沒輸入參數, 預設會把所有 commit log 都列出來

  • svn log
  • svn log -l 10 # 顯示 10 筆(最新 10筆 Log)
  • svn log -c 100 # 顯示 revision 100 的 Log
  • svn log -v -c 100 # 顯示  revision 100 的詳細 Log

Propset (propset, pset, ps): 版本控制都有些特殊 Keyword 設定, 如 Id 就是最常用的, 設定方法如下:

  1. 在檔案內找地方加入 $Id$
  2. 設定此檔案要能吃 Id 的 Keyword: svn ps svn:keywords 'Id' filename (只需設一次即可, 之後就不用再設)
  3. svn ci 後, $Id$ 會自動代換成 $Id:filename 編號 年月日時分秒 username $ 的資訊
  4. svn help ps 可以看到有哪些 Keyword 可以用, 即 Keyword 的說明.(ex: URL, Author, Date, Rev, Id 等.)

其它 SVN Client:

SVK 相關介紹:

其它相關網頁



更多推薦文章

This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.

About Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
This entry was posted in My_Note-Programming. Bookmark the permalink.

92 Responses to SVN 基本指令教學

  1. FBB says:

    您好:
    過了一陣子又來請教您問題了!一直有個疑問是,在XP上的程式碼或者是資料夾要如何丟進ubuntu裡面?之前是灌了TortoiseSVN,但是我想應該不用這麼麻煩才對。難道要透過VirtualBox的共享資料夾來傳送檔案嗎?

  2. Tsung says:

    厄, 我不懂您要做的事耶, svn commit ?
    如果是的話, XP 是都灌 TortoiseSVN 這套軟體來 commit.
    其它軟體我也不熟耶. 而且, 我沒在用 XP.. Orz..

  3. FBB says:

    假設我的程式碼在XP上,我想用Ubuntu的Subversion來做版本控制,我要如何將檔案從XP移動到Ubuntu裡面?之前的做法是在XP上用TortoiseSVN,設一個資料夾,選擇create repository here,之後在將XP上的程式碼丟進這個資料夾做check-in check-out的動作,資料夾的名稱位址要跟Ubuntu的一樣,這樣Ubuntu就可以看到XP上的檔案並做控制了。我想問的是有沒有其他方法,這樣似乎有點繁複,還有要如何將一整個資料夾的程式碼放到Ubuntu去呢?

  4. Tsung says:

    厄, 直接在 local 建立一個資料夾, 把檔案都放進去.
    再來 svn add directory 就會順便把裡面的檔案都丟進去了.
    或者用 import 的方式(第一次)
    這不會複雜阿.. 還是你覺得要怎麼做??.. @.@a..

  5. FBB says:

    您好
    上次的問題已經解決了^^
    這次又有問題想請教一下,我用的是svn://沒有搭配SSH
    網上很少有關只有svn://這部分的權限設定文章
    結果就自己先照著其他協定的方式設定一次,發現跟version control with subversion所說的不同,他無法在svn://ip/後面輸入詳盡的path,例如:svn://ip/repo/project 會出現URL 'svn://ip/repo/project' doesn't exist所以才想說是不是有地方沒設定好?
    還是說只有svn://這個協定是只能輸入svn://ip/?

  6. Tsung says:

    厄, svn:// 我沒有研究耶~
    找不到哪邊要用 svn:// 所以都沒有研究~ Orz..

  7. FBB says:

    那還是謝謝了QQ

  8. ajuang says:

    你好,請教分支branch/tag問題: 嘗試多種方式無法成功,且 browser 工作正常.
    #svn copy http://localhost/svn/evalbd http://localhost/svn/NetApp/branch/evalbd_branch
    svn: Server sent unexpected return value (403 Forbidden) in response to OPTIONS request for 'http://localhost/svn'
    #svn copy file: home/svn/evalbd file: home/svn/NetApp/branch/evalbd_branch
    svn: 無法開啟 URL 的 ra_local session
    svn: 無法開啟檔案庫 'file: home/svn'
    WorkSpace:
    ==================
    /home/allen/evalbd
    svn:
    ==================
    /home/svn/evalbd
    /home/svn/NetApp/branch/evalbd_branch
    subversion.conf:
    =====================
    DAV svn
    SVNParentPath /homesvn

  9. Tsung says:

    您是丟到不同的 svn repository?
    應該要另外 import, 而不是 copy?

  10. ajuang says:

    抱歉我不了解你的意思!
    我要copy的來源和目的都在 /home/svn 之下, 為何說是不同 repository?
    還是我弄錯了呢?

  11. Tsung says:

    是我搞錯了, 因為命名方式搞混了. Orz.
    想問一下, 是否已經有 /home/svn/NetApp/branch/ 這些目錄了? (在 SVN 裡面).
    如果沒有的話, 先試著把這些建出來再做 copy 動作看看?

  12. ajuang says:

    先謝謝你快速回應!
    是的,我也有先建 svnadmin create /home/svn/NetApp/branch/evalbd_branch
    但結果就如我所 post

  13. Tsung says:

    嗯嗯, 就跟我想的一樣. XD
    您建了兩個 repository.
    svn 要建 branch, 得要在同一個 repository.
    您不需要另外用 svnadmin create.
    您把 svn 的 /home/svn 當 file system 的觀念去想, 會比較容易懂~ :)

  14. ajuang says:

    我嘗試以下操作,svn copy 還是有問題!
    ================================
    #svn import /home/allen/NetApp file: home/svn/NetApp/
    新增 /home/allen/NetApp/trunk
    新增 /home/allen/NetApp/trunk/hello
    新增 /home/allen/NetApp/trunk/hello/hello.c
    新增 /home/allen/NetApp/trunk/hello/hello.h
    新增 /home/allen/NetApp/branches
    新增 /home/allen/NetApp/tags
    #svn copy http://localhost/svn/NetApp/trunk/hello http://localhost/svn/NetApp/branches/hello_branch
    svn: Can't open file '/home/svn/NetApp/db/txn-current-lock': Permission denied

  15. Tsung says:

    厄, chmod 777 -R /home/svn/NetApp/db 看看?

  16. ajuang says:

    解決了!
    但我不確定是不是沒有 chmod 的關係!
    跟 chown -R apache:apache /home/svn/NetApp 不知有無影響?

  17. Tsung says:

    有影響, 因為您的 SVN 是走 Apache, 所以權限需要是 Apache 的權限.
    那解法就是改成 Apache 的權限, 或者就是開 777(大家都可讀寫), 就可以囉~ :)

  18. 阿奎 says:

    資料真的很豐富~ 謝謝

  19. Luke says:

    我是用 TortoiseSVN -> Show Log(顯示紀錄),
    然後選取一個版本,然後選取位於畫面下方的檔案,最後按右鍵,
    會出現一個選項"Save Revision to..(儲存版本至..)",
    這樣可以複製到我指定的資料夾。
    現在問題是,複製過來的未包含其目錄,
    我希望能夠保留其路徑。是否有辦法達到呢?
    例如:
    [檔案庫]中是
    /dir_a/file_x
    /dir_b/dir_b_1/file_y
    /file_z
    [問題]是
    /file_x
    /file_y
    /file_z

  20. Tsung says:

    含上一層目錄都複製就好了?

  21. wei says:

    想請問一下版主,如果現在我從別人電腦的檔案庫checkout一份code。然後我想要把這份code在commit到我電腦中的檔案庫中,請問我該怎麼下commit指令呢?(我已經用過一次import把basic版本import進去了,這次想把差異部分commit到我這台電腦做備份)

  22. Tsung says:

    checkout 一份你自己檔案庫的 code, 然後把其它地方下載的 code, copy 到你自己檔案庫的 code 那個目錄, 再 commit 即可.

  23. Jason says:

    您好:
    原先別人在server上架設用vmware + redhat 3企業版架設 svn + apache2
    ,可以正常存取,但我接手後
    mount一個新的磁碟 /jason
    svn新增一個資料夾 /jason/repos
    設定/jason/repos/conf/authz
    [repos:/]
    jason=rw
    httpd.conf新增的設定也跟之前一樣

    DAV svn
    SVNParentPath /jason/repos
    Satisfy Any
    AuthType Basic
    AuthName "SVN Repository"
    AuthUserFile /jason/repos/conf/authz
    AuthzSVNAccessFile /jason/repos/conf/passwd
    Require valid-user

    請問:
    為什麼用ie連上去還是permission denid?
    http://my-ip/jason/repos
    PS:我已經將資料夾權限開至777

  24. 47 says:

    Tsung兄
    請問您一下, 假設我有兩個修訂版1和2, 我在修訂版2裡執行[update to revision]回修訂版1, 接著回到修訂版1後, 進行修改, 再commit時, 就會發生錯誤
    Commit failed (details follow):
    File or directory 't1.txt' is out of date; try updating
    resource out of date; try updating
    請問這該怎麼解決, 因為用update好像就又會變回修訂版2,
    還是說這種案例不是這樣處理的

    謝謝

    • Tsung says:

      svn 的一個優點是, 你可以 checkout 某個版本的某個檔案.
      所以, 要還原的話, 我都是在另一個地方, checkout 那個版本的檔案後, cp 回去蓋掉,
      在 commit log 寫 rollback. :)

  25. Pingback: SVN指令簡介 | 開車到處玩

  26. Pingback: Project Management 工具 – Trac « Mr.pojenlai

  27. Stephen says:

    有個問題想請教一下,假設我現在svn 已經到了100版, 如果我要切割成2份 一份1~ 70, 另外一份71之後開始算起, dump 版本我會,但是我把第二份load 進去的時候,版本編號會從1開始算起, 我應該怎麼修改版本編號?

    • Tsung says:

      這個我不知道耶, 理論上, 不應該會有修改版號這種事情耶.
      這是歷史紀錄, 如果歷史紀錄可以修改... 那就不叫歷史紀錄了. XD

  28. Stephen says:

    那麼,請教一下有什麼方法可以延續版號嗎?

  29. Stephen says:

    不好意思,我的作法是這樣
    svnadmin dump -r50:100 /home/svn/src > /src_50-100
    svnadmin create src_50-100
    svnadmin load src_50-100 < /src_50-100

    可是這樣的話 src_50-100 的 svn 版號 會從1開始算起
    有沒有什麼方法可以當co 版本時可以從50開始算?

  30. Stephen says:

    很抱歉問了這個奇怪的問題, 實際上我的server是一台4核的Desktop.
    每天都會備份所以將下列指令放在crontab內 dump source
    svnadmin dump /home/svn/source > /backup/source.bak
    可是我發現當系統執行這個指令的時候會不完全,實際上只dump 169版
    可是我的source已經到了200,所以才會有將source切割的想法

    ps :如果不透過crontab而直接在console下指令,卻不會有dump不完全的問題

  31. Ericchu says:

    版主您好:我想請問一下
    我已經有一個資料夾受到SVN版本的控制。
    其中其他的AutoBuild軟體(HudSon)每日會自動update那個資料夾並編譯出新版程式 。
    我該如何在Windows系統下寫一個批次檔batch檔自動去執行commit呢?
    我試過在批次檔裡寫如下的指令

    C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe /command:commit /path:D:\Hudson\workspace\PowerCarBuild\build\newest_build /closeonend:1

    他會執行(打開)TortoiseSVN,但是並不會自動commit,必需要有人
    按下確認之後才會真正執行commit指令。但我想要的是他完全自動化
    不知道有沒有什麼解決的方式呢?非常謝謝回答

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*

您可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>