環境說明
系統版本 CentOS 7.2 x86_64
SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,相較於RCS、CVS,它采用了分支管理系統,它的設計目標就是取代CVS。svn服務器有2種運行方式:獨立服務器和借助apache運行。兩種方式各有利弊,用戶可以自行選擇。
svnserve是SVN自帶的一個輕型服務器,客戶端通過使用以svn://或svn+ssh://為前綴的URL來訪問svnserve服務器,實現遠程訪問SVN版本庫。svnserve可以通過配置文件來設置用戶和口令,以及按路徑控制版本庫訪問權限。本文詳細分析了svnserve配置文件格式,並說明如何使用配置文件控制版本庫訪問權限
svn的版本管理其最大的特點就是集中式,所有的項目代碼文件都放在svn服務器上,客戶端並不具有全部項目代碼文件,因此對svn服務器的設備要求較高
1、服務端安裝配置
[root@svn-server ~]# yum install -y subversion
[root@svn-server ~]# mkdir -p /application/svndata #創建svn的版本庫的根目錄
[root@svn-server ~]# mkdir -p /application/svnpasswd #創建svn的密碼權限目錄
[root@svn-server ~]# svnserve -d -r /application/svndata #啟動,指定svn的根目錄(-d: 后台運行,-r:路徑)
[root@svn-server ~]# netstat -lntup|grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2231/svnserve
建立版本庫(也可以理解為是一個項目,這個目錄不能用mkdir來創建,因為svn有自己運行方式,會創立屬於svn自己很多的文件)
[root@svn-server ~]# svnadmin create /application/svndata/sadoc
修改配置文件
[root@svn-server ~]# cd /application/svndata/sadoc/conf/
[root@svn-server conf]# cp svnserve.conf svnserve.conf.bak
[root@svn-server conf]# vim svnserve.conf
[general]
anon-access=none #控制非鑒權用戶訪問版本庫的權限。取值范圍為"write"、"read"和"none"。
即"write"為可讀可寫,"read"為只讀,"none"表示無訪問權限。
缺省值:read
auth-access=write #控制鑒權用戶訪問版本庫的權限。取值范圍為"write"、"read"和"none"。
即"write"為可讀可寫,"read"為只讀,"none"表示無訪問權限。
缺省值:write
password-db = passwd #指定用戶名口令文件名。除非指定絕對路徑,否則文件位置為相對conf
目錄的相對路徑。
缺省值:passwd
authz-db = authz #指定權限配置文件名,通過該文件可以實現以路徑為基礎的訪問控制。
除非指定絕對路徑,否則文件位置為相對conf目錄的相對路徑。
缺省值:authz
realm= My First Repository #指定版本庫的認證域,即在登錄時提示的認證域名稱。若兩個版本庫的
認證域相同,建議使用相同的用戶名口令數據文件。
缺省值:一個UUID(Universal Unique IDentifier,全局唯一標示)
[root@svn-server conf]# pwd
/application/svndata/sadoc/conf
[root@svn-server conf]# chmod 700 * #修改權限(原來的權限為644,任何人都可以看到, svn的密碼是明文的)
[root@svn-server conf]# vim passwd #末行添加以下用戶
[users]
test1 = 1111
test2 = 2222
test3 = 3333
用戶名口令文件由svnserve.conf的配置項password-db指定,缺省為conf目錄中的passwd。該文件僅由一個[users]配置段組成。
[users]配置段的配置行格式如下:
<用戶名> = <口令>
注意:配置行中的口令為未經過任何處理的明文
[root@svn-server conf]# vim authz
dev = test1,test2 #定義組名和組成員(在passwd里定義的)
ops = test3 #定義組名和組成員
[sadoc:/] #定義項目額權限: 項目名稱sadoc,表示該項目下所有內容允許誰可以有什么權限
@dev = rw #允許某個組dev來訪問,則前面要加@這個符號來標識下
@ops = r #允許ops組來查看
test3 = r #允許用戶test3來查看
權限配置文件由svnserve.conf的配置項authz-db指定,缺省為conf目錄中的authz。該配置文件由一個[groups]配置段和若干個版本庫路徑權限段組成。
[groups]配置段中配置行格式如下:
<用戶組> = <用戶列表>
用戶列表由若干個用戶組或用戶名構成,用戶組或用戶名之間用逗號","分隔,引用用戶組時要使用前綴"@"(如:引用用戶組"all"要使用字符串"@all")。
版本庫路徑權限段的段名格式如下:
[<版本庫名>:<路徑>]
如版本庫abc路徑/tmp的版本庫路徑權限段的段名為"[abc:/tmp]"。
可省略段名中的版本庫名。若省略版本庫名,則該版本庫路徑權限段對所有版本庫中相同路徑的訪問控制都有效。如:段名為"[/tmp]"的版本庫路徑權限段設置了所有引用該權限配置文件的版本庫中目錄"/tmp"的訪問權限。
版本庫路徑權限段中配置行格式有如下三種:
<用戶名> = <權限>
<用戶組> = <權限>
* = <權限>
其中,"*"表示任何用戶;權限的取值范圍為''、'r'和'rw',''表示對該版本庫路徑無任何權限,'r'表示具有只讀權限,'rw'表示有讀寫權限。
注意:每行配置只能配置單個用戶或用戶組。
配置文件保存后就立即生效,重啟或者不重啟svnserve服務都可以
[root@svn-server conf]# pkill svnserve
[root@svn-server conf]# svnserve -d -r /application/svndata #重新啟動svn
[root@svn-server conf]# netstat -lntup|grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2309/svnserve
啟動到svndata這個目錄,所以在客戶端訪問的URL中末尾續接上/sadoc,假如只有1個項目時,就可以 svnserve .../application/svndata/sadoc,直接輸入地址svn://xxx.xxx.xxx.xxx即可訪問
[root@svn-server conf]# vim /etc/rc.d/rc.local #將svn加入到開機啟動
/usr/bin/svnserve -d -r /application/svndata
SVN配置詳細信息參考:https://blog.csdn.net/thinkerabc/article/details/1831025
2、客戶端配置和使用
2.1 Linux客戶端使用svn
[root@svn-client ~]# yum install -y subversion
基本操作:
[root@svn-client ~]# svn checkout svn://10.0.0.10/sadoc #導出
認證領域: <svn://10.0.0.10:3690> My First Repository
"root"的密碼:
認證領域: <svn://10.0.0.10:3690> My First Repository
用戶名: test1
"test1"的密碼:
-----------------------------------------------------------------------
注意! 你的密碼,對於認證域:
<svn://10.0.0.10:3690> My First Repository
只能明文保存在磁盤上! 如果可能的話,請考慮配置你的系統,讓 Subversion
可以保存加密后的密碼。請參閱文檔以獲得詳細信息。
你可以通過在"/root/.subversion/servers"中設置選項"store-plaintext-passwords"為"yes"或"no",
來避免再次出現此警告。
-----------------------------------------------------------------------
保存未加密的密碼(yes/no)?yes
A sadoc/.bash_logout
A sadoc/.tcshrc
A sadoc/.viminfo
A sadoc/.bash_profile
A sadoc/.bash_history
A sadoc/.subversion
A sadoc/.subversion/servers
A sadoc/.subversion/README.txt
A sadoc/.subversion/auth
A sadoc/.subversion/auth/svn.username
A sadoc/.subversion/auth/svn.ssl.client-passphrase
A sadoc/.subversion/auth/svn.ssl.server
A sadoc/.subversion/auth/svn.simple
A sadoc/.subversion/auth/svn.simple/02f30398314dca65b675ce5570f28e52
A sadoc/.subversion/config
A sadoc/anaconda-ks.cfg
A sadoc/.bashrc
A sadoc/.cshrc
取出版本 1。
[root@svn-client ~]# svn import /service/tools/jeesns.jsp svn://10.0.0.10/sadoc -m "version1" #導入某個代碼文件
[root@svn-client ~]# svn ls svn://10.0.0.10/sadoc #查看svn中的數據
附:常用命令(參考自https://blog.csdn.net/liuchong_lch/article/details/78192755)
1、將文件checkout到本地
svn checkout path(path是服務器的目錄)
例如 :svn checkout svn://192.168.1.1/pro/domain
2、往版本庫中添加新的文件
svn add filename
例如:svn add test.cpp
3、將改動的文件提交到版本庫
svn commit -m "注釋" [-N] [--no-unlock] PATH(如果選擇了保持鎖,就使用--no-unlock開關)
例如:svn commit -m "注釋" test.cpp
簡寫:svn ci
4、加鎖/解鎖
svn lock -m "注釋" path
例如: svn lock -m "注釋" test.cpp
svn unlock path
5、更新到某個版本
svn update -r 版本號 path
svn update 更新當前目錄以及子目錄下的所有文件到最新版本
svn upate -r 200 test.cpp 將版本庫中的test.cpp還原到版本200
簡寫 svn up
6、查看文件或者目錄狀態
(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、刪除文件
svn delete path -m "注釋"
例如: svn delete svn://192.168.1.1/pro/domain/test.cpp -m "delete test file"
或者直接svn delete test.php 然后再svn ci -m 'delete test file',推薦使用這種
簡寫: svn (del、remove、rm)
8、查看日志
svn log path
9、查看文件詳細信息
svn info path
10、比較差異
svn diff path(將修改的文件與基礎版本比較)
svn diff -r m:n (將修改的文件m版本和n版本比較)
簡寫 svn di
11、將兩個版本的文件的差異合並到當前文件
svn merge -r m:n path
例如:svn
merge -r 20:25 test.cpp(將版本20與25之間的差異合並到當前文件,但一般會發生沖突,需要處理一下)
12、SVN幫助
svn help
以上為常用命令,下面為不常用命令
13、查看版本庫下的文件和列表
svn list path (顯示path目錄下的所屬於版本的文件和目錄)
簡寫: svn ls
14、創建納入版本控制下的新目錄
svn mkdir: 創建納入版本控制下的新目錄。
用法: 1、mkdir PATH...
2、mkdir URL...
創建版本控制的目錄。
1、每一個以工作副本 PATH 指定的目錄,都會創建在本地端,並且加入新增調度,以待下一次的提交。
2、每個以URL指定的目錄,都會透過立即提交於倉庫中創建。在這兩個情況下,所有的中間目錄都必須事先存在。
15、恢復本地修改
svn revert:恢復原始未改變的工作副本文件(恢復大部分的本地修改)revert用法:revert path
注意:本子命令不會存儲網絡,並且會解除沖突的情況。但它不會恢復被創建的目錄
16、代碼庫URL變更
svn switch(sw): 更新工作副本到不同的URL。
用法
1、switch URL [PATH]
2、switch --relocate FROM TO [PATH]
1、更新工作副本,映射到一個新的URL,會將服務上的文件與本地文件合並。這是將工作副本對應到同一創庫的某個分支或者標記的方法。
2、改寫工作副本URL元數據,以反映URL的變更,創庫URL變動但工作副本仍舊對映同一創庫的同一目錄時使用該命令更新工作副本與創庫的對應關系。
17、解決沖突
svn resolved:移除工作副本的目錄或文件的"沖突"狀態。
用法 resolved path
注意:本子命令不會依語法來解決沖突或是移除沖突標記;它只是移除沖突的相關文件,然后讓path可以再次提交。
18、輸出指定文件的URL內容
svn cat 目標[@版本] 如果指定了版本將從指定的版本開始查找。
2.2 windows客戶端使用svn
下載TortoiseSVN客戶端,下載地址https://tortoisesvn.net/downloads.html,這個地址也提供了語言包的下載,選擇需要下載的語言包,在安裝完TortoiseSVN后安裝語言包即可,圖形界面使用簡單使用指南,這里不想多說,可以參考https://blog.csdn.net/maplejaw_/article/details/52874348