SVN 的基本指令介紹, 主要參考自下述:
- SubTrain - Open Source Trainings for Subversion: 教導如何使用 SVN
- Version Control with Subversion
- Version Control with Subversion(中文版電子書)
- Version Control with Subversion PDF - 作者: 邱茂森(Google 找到的, 相當實用的介紹 和 說明)
主要 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 就是最常用的, 設定方法如下:
- 在檔案內找地方加入 $Id$
- 設定此檔案要能吃 Id 的 Keyword: svn ps svn:keywords 'Id' filename (只需設一次即可, 之後就不用再設)
- svn ci 後, $Id$ 會自動代換成
$Id:filename 編號 年月日時分秒 username $
的資訊 - svn help ps 可以看到有哪些 Keyword 可以用, 即 Keyword 的說明.(ex: URL, Author, Date, Rev, Id 等.)
其它 SVN Client:
- Windows Client: TortoiseSVN
- SVK: The SVK version control system
SVK 相關介紹:
其它相關網頁
- Subversion 版本控制系統的基礎觀念 - 此篇有講版本系統該如何使用 等等的基本觀念, 建議閱讀.
- Subversion post-commit 的解說以及注意事項
- post-commit 如果沒有這行會無法自動 post-commit - post-commit 前, 建議先跑 export LANG=zh_TW.UTF-8(看系統語系編碼設定)
更多推薦文章
This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.


您好:
過了一陣子又來請教您問題了!一直有個疑問是,在XP上的程式碼或者是資料夾要如何丟進ubuntu裡面?之前是灌了TortoiseSVN,但是我想應該不用這麼麻煩才對。難道要透過VirtualBox的共享資料夾來傳送檔案嗎?
厄, 我不懂您要做的事耶, svn commit ?
如果是的話, XP 是都灌 TortoiseSVN 這套軟體來 commit.
其它軟體我也不熟耶. 而且, 我沒在用 XP.. Orz..
假設我的程式碼在XP上,我想用Ubuntu的Subversion來做版本控制,我要如何將檔案從XP移動到Ubuntu裡面?之前的做法是在XP上用TortoiseSVN,設一個資料夾,選擇create repository here,之後在將XP上的程式碼丟進這個資料夾做check-in check-out的動作,資料夾的名稱位址要跟Ubuntu的一樣,這樣Ubuntu就可以看到XP上的檔案並做控制了。我想問的是有沒有其他方法,這樣似乎有點繁複,還有要如何將一整個資料夾的程式碼放到Ubuntu去呢?
厄, 直接在 local 建立一個資料夾, 把檔案都放進去.
再來 svn add directory 就會順便把裡面的檔案都丟進去了.
或者用 import 的方式(第一次)
這不會複雜阿.. 還是你覺得要怎麼做??.. @.@a..
您好
上次的問題已經解決了^^
這次又有問題想請教一下,我用的是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/?
厄, svn:// 我沒有研究耶~
找不到哪邊要用 svn:// 所以都沒有研究~ Orz..
那還是謝謝了QQ
你好,請教分支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
您是丟到不同的 svn repository?
應該要另外 import, 而不是 copy?
抱歉我不了解你的意思!
我要copy的來源和目的都在 /home/svn 之下, 為何說是不同 repository?
還是我弄錯了呢?
是我搞錯了, 因為命名方式搞混了. Orz.
想問一下, 是否已經有 /home/svn/NetApp/branch/ 這些目錄了? (在 SVN 裡面).
如果沒有的話, 先試著把這些建出來再做 copy 動作看看?
先謝謝你快速回應!
是的,我也有先建 svnadmin create /home/svn/NetApp/branch/evalbd_branch
但結果就如我所 post
嗯嗯, 就跟我想的一樣. XD
您建了兩個 repository.
svn 要建 branch, 得要在同一個 repository.
您不需要另外用 svnadmin create.
您把 svn 的 /home/svn 當 file system 的觀念去想, 會比較容易懂~
我嘗試以下操作,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
厄, chmod 777 -R /home/svn/NetApp/db 看看?
解決了!
但我不確定是不是沒有 chmod 的關係!
跟 chown -R apache:apache /home/svn/NetApp 不知有無影響?
有影響, 因為您的 SVN 是走 Apache, 所以權限需要是 Apache 的權限.
那解法就是改成 Apache 的權限, 或者就是開 777(大家都可讀寫), 就可以囉~
資料真的很豐富~ 謝謝
我是用 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
含上一層目錄都複製就好了?
想請問一下版主,如果現在我從別人電腦的檔案庫checkout一份code。然後我想要把這份code在commit到我電腦中的檔案庫中,請問我該怎麼下commit指令呢?(我已經用過一次import把basic版本import進去了,這次想把差異部分commit到我這台電腦做備份)
checkout 一份你自己檔案庫的 code, 然後把其它地方下載的 code, copy 到你自己檔案庫的 code 那個目錄, 再 commit 即可.
您好:
原先別人在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
因功力尚淺,還望大大回答
謝謝
我不太清楚你是怎麼架設的, 不過, 一般都不會讓人可以存取根目錄.
設定應該是在 repos 下面, 在建立一層 Project, 那個才是可以存取到的階層.
(純屬猜測, 因為這個可能的原因太多了, 不知道怎麼架設, 沒辦法找問題, 參考看看囉~)
我忘了說錯誤是403 Forbidden
我在repos下建立了test還是一樣的結果
因剛接觸架設svn,所以有很多不太清楚,
請問要知道怎麼架設指的是?
你要不要參考這篇: http://blog.longwin.com.tw/2007/07/debian_set_subversion_2007/
看這個步驟, 然後去追追看是不是有哪個步驟可能是漏掉的, 然後把他補起來?
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,
還是說這種案例不是這樣處理的
謝謝
svn 的一個優點是, 你可以 checkout 某個版本的某個檔案.
所以, 要還原的話, 我都是在另一個地方, checkout 那個版本的檔案後, cp 回去蓋掉,
在 commit log 寫 rollback.
Pingback: SVN指令簡介 | 開車到處玩
Pingback: Project Management 工具 – Trac « Mr.pojenlai
有個問題想請教一下,假設我現在svn 已經到了100版, 如果我要切割成2份 一份1~ 70, 另外一份71之後開始算起, dump 版本我會,但是我把第二份load 進去的時候,版本編號會從1開始算起, 我應該怎麼修改版本編號?
這個我不知道耶, 理論上, 不應該會有修改版號這種事情耶.
這是歷史紀錄, 如果歷史紀錄可以修改... 那就不叫歷史紀錄了. XD
那麼,請教一下有什麼方法可以延續版號嗎?
不是都會嗎? 如果是移動到另外一個地方, 你就 dump -> import 就可以延續囉~
不好意思,我的作法是這樣
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開始算?
這個我不知道耶.... 從來沒有這種需求過. Orz.
很抱歉問了這個奇怪的問題, 實際上我的server是一台4核的Desktop.
每天都會備份所以將下列指令放在crontab內 dump source
svnadmin dump /home/svn/source > /backup/source.bak
可是我發現當系統執行這個指令的時候會不完全,實際上只dump 169版
可是我的source已經到了200,所以才會有將source切割的想法
ps :如果不透過crontab而直接在console下指令,卻不會有dump不完全的問題
備份的話, 可以參考此篇: http://kennyp.pixnet.net/blog/post/13901977-subversion%E7%9A%84%E5%82%99%E4%BB%BDhotcopy%E4%BB%A5%E5%8F%8Adump%E7%9A%84%E4%BD%BF%E7%94%A8
版主您好:我想請問一下
我已經有一個資料夾受到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指令。但我想要的是他完全自動化
不知道有沒有什麼解決的方式呢?非常謝謝回答
嗯嗯, Windows 你可能得要找一下 Command 的路徑, 做類似下述的事情:
svn add *
svn commit
就可以做到你想要得事情了.