SVN(Subversion)是一個自由、開源的項目源代碼版本控制工具。目前,絕大多數開源軟體和企業代碼管理,都使用SVN作為代碼版本管理軟體。
Subversion将檔案存放在中心版本庫裡,這個版本庫很像一個普通的檔案伺服器。不同的是,它可以記錄每一次檔案和目錄的修改情況,這樣就可以在需要的復原時,将資料恢複到以前的版本,并可以檢視資料的更改細節。
SVN 官方網址:Apache Subversion
SVN 伺服器配置:安裝SVN伺服器
一、 SVN常用指令
1、Linux指令行下将檔案checkout到本地目錄
svn checkout path(path是伺服器上的目錄)
例如:svn checkout svn://192.168.1.1/pro/domain
(如果第一次使用svn,要使用 使用者名、 密碼:svn checkout svn://192.168.1.1/pro/domain user password)
簡寫:svn co
2、Linux指令行下往版本庫中添加新的檔案
svn add file
例如:svn add test.php(添加test.php)
但是我add沒有成功,使用commit 成功了。見下一條
svn add *.php(添加目前目錄下所有的php檔案)
3、Linux指令行下将改動的檔案送出到版本庫
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果選擇了保持鎖,就使用–no-unlock開關)
例如:svn commit -m “add test file for my test“ test.php
簡寫:svn ci
4、Linux指令行下的加鎖/解鎖
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、Linux指令行下更新到某個版本
svn update -r m path
例如:
svn update 如果後面沒有目錄,預設将目前目錄以及子目錄下的所有檔案都更新到最新版本。
svn update -r 200 test.php(将版本庫中的檔案test.php還原到版本200)
svn update test.php(更新,于版本庫同步。如果在送出的時候提示過期的話,是因為沖突,需要先update,修改檔案,然後清除svn resolved,最後再送出commit)
簡寫:svn up
6、Linux指令行下檢視檔案或者目錄狀态
1)svn status path(目錄下的檔案和子目錄的狀态,正常狀态不顯示)
【?:不在svn的控制中;M:内容被修改;C:發生沖突;A:預定加入到版本庫;K:被鎖定】
2)svn status -v path(顯示檔案和子目錄狀态)
第一列保持相同,第二列顯示工作版本号,第三和第四列顯示最後一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert這三條指令在沒有網絡的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。
簡寫:svn st
7、Linux指令行下删除檔案
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然後再svn ci -m ‘delete test file‘,推薦使用這種
簡寫:svn (del, remove, rm)
8、Linux指令行下檢視日志
svn log path
例如:svn log test.php 顯示這個檔案的所有修改記錄,及其版本号的變化
9、Linux指令行下檢視檔案詳細資訊
svn info path
例如:svn info test.php
10、Linux指令行下比較差異
svn diff path(将修改的檔案與基礎版本比較)
例如:svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差異)
二、 SVN不常用指令
13、版本庫下的檔案和目錄清單
svn list path 顯示path目錄下的所有屬于版本庫的檔案和目錄簡寫:svn ls
14、建立納入版本控制下的新目錄
svn mkdir: 建立納入版本控制下的新目錄。
用法:
1、mkdir PATH...
每一個以工作副本 PATH 指定的目錄,都會建立在本地端,并且加入新增排程,以待下一次的送出。
2、mkdir URL... 建立版本控制的目錄。
每個以URL指定的目錄,都會透過立即送出于倉庫中建立。在這兩個情況下,所有的中間目錄都必須事先存在。
15、恢複本地修改
svn revert: 恢複原始未改變的工作副本檔案 (恢複大部份的本地修改)。
用法: revert PATH... 注意: 本子指令不會存取網絡,并且會解除沖突的狀況。但是它不會恢複被删除的目錄
16、代碼庫URL變更
svn switch (sw): 更新工作副本至不同的URL。
用法:
1、switch URL [PATH]
更新你的工作副本,映射到一個新的URL,其行為跟“svn update”很像,也會将 伺服器上檔案與本地檔案合并。這是将工作副本對應到同一倉庫中某個分支或者标記的方法。
2、switch --relocate FROM TO [PATH...]
改寫工作副本的URL中繼資料,以反映單純的URL上的改變。當倉庫的根URL變動 (比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用 這個指令更新工作副本與倉庫的對應關系。
17、解決沖突
svn resolved: 移除工作副本的目錄或檔案的“沖突”狀态。
用法: resolved PATH... 注意: 本子指令不會依文法來解決沖突或是移除沖突标記;它隻是移除沖突的相關檔案,然後讓 PATH 可以再次送出。
18、輸出指定檔案或URL的内容。
svn cat 目标[@版本]...如果指定了版本,将從指定的版本開始查找。 svn cat -r PREV filename > filename (PREV 是上一版本,也可以寫具體版本号,這樣輸出結果是可以送出的)
三、 SVN其它指令
雖然不像本章先前讨論過的那些指令那麼常用,但是有時你也需要這些指令。
svn cleanup
當Subversion修改你的工作副本時(或者任何在.svn中的資訊),它嘗試盡可能做到安全。在改變一個工作副本前,Subversion把它的意 圖寫到一個日志檔案中。接下來它執行日志檔案中的指令來應用要求的修改。最後,Subversion删除日志檔案。從架構上來說,這與一個日志檔案系統 (journaled filesystem)類似。如果一個 Subversion操作被打斷(例如,程序被殺掉了,或機器當掉了)了,日志檔案仍在硬碟上。重新執行日志檔案,Subversion可以完成先前開始 的操作,這樣你的工作副本能回到一個可靠的狀态。
以下是svn cleanup所做的:它搜尋你的工作副本并執行所有遺留的日志,在這過程中删除鎖。如果Subversion曾告訴你你的工作副本的一部分被“鎖定”了,那麼你應該執行這個指令。另外, svn status會在鎖定的項前顯示L。
$ svn status
L somedir
M somedir/foo.c
$ svn cleanup
$ svn status
M somedir/foo.c
svn import
使用svn import是把未版本化的檔案樹複制到資料庫的快速辦法,它需要建立一個臨時目錄。
$ svnadmin create /usr/local/svn/newrepos
$ svn import mytree file:///usr/local/svn/newrepos/some/project
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h
Committed revision 1.
上面的例子把在some/project目錄下mytree目錄的内容複制到資料庫中。
$ svn list file:///usr/local/svn/newrepos/some/project
bar.c
foo.c
subdir/
注意在導入完成後,原來的樹沒有被轉化成一個工作副本。為了開始工作,你仍然需要svn checkout這個樹的一個新的工作副本。
四、SVN 常用指令一覽表
指令 | 功能 | 使用格式 |
checkout | 檢出 | svn co URL |
up | 更新到目前URL的末端 | svn up |
switch | 更新到某一tag/branch | svn switch (tag/分支)URL |
add | 增加 | svn add 檔案名 |
rm | 删除檔案 | svn rm 檔案名 |
删除目錄 | svn rm 目錄名 | |
diff | 與base版本(最後檢出或者更新到的版本)對比 | svn diff |
與版本庫中最新版本對比 | svn diff -r head | |
目前工作副本,兩個版本之間對比 | svn diff -r reversion1:reversion2 | |
版本庫中任意兩個tag做對比 | svn diff (tag1)URL (tag2)URL | |
ci | 送出 | svn ci -m "commit log" |
log | 檢視目前工作副本log | svn log |
隻檢視指定版本的log | svn log -r | |
列印log所有附加資訊 | svn log -v | |
檢視目前tag/branch版本詳情 | svn log --stop-on-copy -v | |
info | 檢視目前工作副本所在URL | svn info |
status | 檢視工作副本的狀态 | svn st |
檢視檔案的taglist | svn指令不支援,可執行cs taglist | |
tag | 新增tag | svn cp . (tag)URL |
删除tag | svn rm (tag)URL -m "commit log" | |
覆寫已經存在的tag | 不支援 | |
分支開發 | 建立branch | svn cp (基線版本)URL (分支)URL -m "commit log" |
删除branch | svn rm (分支)URL -m "commit log" | |
同步 | svn co (主幹)URL | |
cd ~/wc | ||
svn merge (主幹)URL (待同步tag)URL | ||
svn ci -m "commit log" | ||
svn cp (主幹)URL (以_PD_BL_MAIN結尾的tag)URL -m"commit log" | ||
合并 | svn co (合并目标)URL | |
cd ~/wc | ||
svn merge (基線版本tag)URL (上線tag)URL | ||
svn ci -m "commit log" | ||
svn cp (合并目标)URL (上線tag_MERGE_的tag對應)URL -m"commit log" |
SVN執行個體
删除目錄下所有的 .svn 隐藏子目錄
find
. -name ".svn" -print0 |
xargs
-0
rm
-rf
tags打分支
svn cp trunk/ tags/platform_2011.11.11 (或 svn cp http://192.168.1.100/platform/trunk/ http://192.168.1.100/platform/tags/platform_2011.11.11)
svn ci -m "svn cp trunk/ tags/platform_2011.11.11" // 送出,并給出送出記錄(-m "svn cp trunk/ tags/platform_2011.11.11")
svn 改名
svn mv platform_2011.11.11 platform_20111111
svn ci -m "svn mv platform_2011.11.11 platform_20111111" // 送出
svn directory is missing
1) svn up missingDirName
2) svn del missingDirName
3) svn ci
svn chech version
svn co http://192.168.1.100/platform/branch -r 12 platform_branch_v12
svn log
svn log http://192.168.1.100/platform/branch -l10 // svn 文字注釋log
svn log http://192.168.1.100/platform/branch -l10 -v // svn 文字注釋log + 檔案更新log(增,删,改)
svn diff -r v_1 : v_2 svn_path
svn diff -r 200:201 test.php
檢視svn版本
svnserve --version
ubuntu 安裝svn 1.7、1.8
目前 ubuntu 12.04 中的 svn 版本為 1.6,這個版本會在每個子目錄建立一個.svn 的目錄儲存版本檔案,很不爽。找到一個第三方編譯的 ubuntu 源:
1) 打開source.list源:
sudo vi /etc/apt/sources.list
2) 添加源
deb http://ppa.launchpad.net/dominik-stadler/subversion-1.7/ubuntu precise main
deb-src http://ppa.launchpad.net/dominik-stadler/subversion-1.7/ubuntu precise main

3) 執行安裝指令
sudo apt-get install subversion
參考:http://blog.csdn.net/ithomer/article/details/6187464