Subversion 版本控制系統 簡稱 SVN。web
SVN 是一個跨平臺開放源代碼的集中式版本控制系統,能夠實現文件及目錄的保存及版本回溯。數據庫
SVN 管理着隨時間改變的各類數據,這些數據放置在一箇中央檔案庫(repository)中,這個檔案庫很像一個普通的文件服務器或者FTP服務器,不過它會記錄每一次文件的變更。這樣你就能夠把檔案恢復到舊的版本,或是瀏覽文件的變更歷史。apache
SVN 是一個通用的軟件系統,它不但能夠用來管理程序源碼,也能夠管理任何類型的文件。vim
SVN 是一種集中式的版本控制系統,它的核心是中央版本庫(repository),存儲全部的數據,版本庫按照文件樹形式存儲數據(包括文件和目錄),任意數量的的客戶端能夠鏈接到版本庫,讀寫這些文件。經過寫數據,別人能夠看到這些,經過讀數據,能夠看到別人的修改。windows
SVN 存儲的數據不能看到文件實體後端
BDB:(伯克利 DB)
subversion 1.2 版本之前默認的存儲方式;可能出現鎖住數據的的問題;安全
SVN 是一種集中式版本控制系統。集中式管理的工做流程以下圖:bash
集中式代碼管理的核心是SVN服務器,開發者在開始新一天工做以前必須先在本地update一下代碼,而後開發、解決衝突、合併、提交。全部的版本信息都放在SVN服務器上面。服務器
下面舉例說明:網絡
開始新一天的工做:
缺點:
優勢:
官網 http://subversion.apache.org/
最新穩定版:subversion-1.9.7.tar.gz
在windows環境下,最經常使用VisualSVN server 服務端和 TortoiseSVN(簡稱TSVN)客戶端搭配使用
[root@Node1 ~]# yum install subversion [root@Node1 ~]# rpm -ql subversion /etc/bash_completion.d /etc/bash_completion.d/subversion /etc/rc.d/init.d/svnserve /etc/subversion /usr/bin/svn # 客戶端命令 /usr/bin/svnadmin # 服務端svn 版本庫管理工具(建立、導出、導入、刪除等) /usr/bin/svndumpfilter /usr/bin/svnlook # 服務端查看版本庫的信息等 /usr/bin/svnserve # 服務端命令,控制svn服務的啓動等 /usr/bin/svnsync /usr/bin/svnversion /usr/lib64/libsvn_client-1.so.0 /usr/lib64/libsvn_client-1.so.0.0.0 /usr/lib64/libsvn_delta-1.so.0 /usr/lib64/libsvn_delta-1.so.0.0.0 /usr/lib64/libsvn_diff-1.so.0 /usr/lib64/libsvn_diff-1.so.0.0.0 /usr/lib64/libsvn_fs-1.so.0
創建svn版本庫根目錄(svndata)
[root@Node1 ~]# mkdir -p /application/svndata [root@Node1 ~]# tree /application/ /application/ ├── svndata 1 directories, 0 files
啓動svn 服務指定服務的 SVN 根目錄:
[root@Node1 ~]# svnserve --help usage: svnserve [-d | -i | -t | -X] [options] Valid options: -d [--daemon] : daemon mode -i [--inetd] : inetd mode -t [--tunnel] : tunnel mode -X [--listen-once] : listen-once mode (useful for debugging) -r [--root] ARG : root of directory to serve -R [--read-only] : force read only, overriding repository config file --config-file ARG : read configuration from file ARG --listen-port ARG : listen port [mode: daemon, listen-once] --listen-host ARG : listen hostname or IP address [mode: daemon, listen-once] -T [--threads] : use threads instead of fork [mode: daemon] --foreground : run in foreground (useful for debugging) [mode: daemon] --log-file ARG : svnserve log file --pid-file ARG : write server process ID to file ARG [mode: daemon, listen-once] --tunnel-user ARG : tunnel username (default is current uid's name) [mode: tunnel] # 這裏爲何會變成紅色? -h [--help] : display this help --version : show program version information [root@Node1 ~]# svnserve -d -r /application/svndata/ [root@Node1 ~]# ps aux|grep svn root 6784 0.0 0.1 160996 920 ? Ss 11:10 0:00 svnserve -d -r /application/svndata/ root 6786 0.0 0.1 103244 856 pts/0 S+ 11:10 0:00 grep svn [root@Node1 ~]# netstat -tunap|grep svn tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 6784/svnserve
[root@Node1 ~]# svnadmin --help general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...] Type 'svnadmin help <subcommand>' for help on a specific subcommand. Type 'svnadmin --version' to see the program version and FS modules. Available subcommands: crashtest create deltify dump help (?, h) hotcopy list-dblogs list-unused-dblogs load lslocks lstxns pack recover rmlocks rmtxns setlog setrevprop setuuid upgrade verify [root@Node1 ~]# svnadmin create --help create: usage: svnadmin create REPOS_PATH Create a new, empty repository at REPOS_PATH. Valid options: --bdb-txn-nosync : disable fsync at transaction commit [Berkeley DB] --bdb-log-keep : disable automatic log file removal [Berkeley DB] --config-dir ARG : read user configuration files from directory ARG --fs-type ARG : type of repository: 'fsfs' (default) or 'bdb' --pre-1.4-compatible : use format compatible with Subversion versions earlier than 1.4 --pre-1.5-compatible : use format compatible with Subversion versions earlier than 1.5 --pre-1.6-compatible : use format compatible with Subversion versions earlier than 1.6 [root@Node1 ~]# svnadmin create /application/svndata/sadoc [root@Node1 ~]# tree /application/ /application/ ├── svndata │ └── sadoc │ ├── conf # 配置文件 │ │ ├── authz # 用戶權限文件 │ │ ├── passwd # 用戶密碼文件 │ │ └── svnserve.conf # 服務配置文件 │ ├── db # 數據庫 │ │ ├── current │ │ ├── format │ │ ├── fsfs.conf │ │ ├── fs-type │ │ ├── min-unpacked-rev │ │ ├── rep-cache.db │ │ ├── revprops │ │ │ └── 0 │ │ │ └── 0 │ │ ├── revs │ │ │ └── 0 │ │ │ └── 0 │ │ ├── transactions │ │ ├── txn-current │ │ ├── txn-current-lock │ │ ├── txn-protorevs │ │ ├── uuid │ │ └── write-lock │ ├── format │ ├── hooks # 鉤子文件夾 │ │ ├── post-commit.tmpl │ │ ├── post-lock.tmpl │ │ ├── post-revprop-change.tmpl │ │ ├── post-unlock.tmpl │ │ ├── pre-commit.tmpl │ │ ├── pre-lock.tmpl │ │ ├── pre-revprop-change.tmpl │ │ ├── pre-unlock.tmpl │ │ └── start-commit.tmpl │ ├── locks # 鎖文件 │ │ ├── db.lock │ │ └── db-logs.lock │ └── README.txt
svnserve經過配置文件來設置用戶和口令,以及按路徑控制版本庫訪問權限。
下面詳細學習svnserve配置文件svnserve.conf的格式,並說明如何使用配置文件控制版本庫訪問權限。
svn服務配置文件:
該文件版本庫目錄的conf目錄下,文件名爲svnserve.conf。
用戶密碼配置文件:
該文件名在文件svnserve.conf中指定,缺省爲同目錄下的passwd。
用戶權限配置文件:
該文件名也在文件svnserve.conf中指定,缺省爲同目錄下的authz。
svn服務配置文件爲版本庫目錄中conf/svnserve.conf 文件。該文件僅由[general]和[sasl]配置段組成。
[general]配置段中配置行格式以下:
<配置項> = <值>
配置項分爲如下5項:
注意: svnserve.conf 文件必須中必須頂格寫(註釋行也必須頂格寫),不然報錯。
[root@Node1 conf]# ls authz passwd svnserve.conf [root@Node1 conf]# cp -a svnserve.conf svnserve.conf.`date +%F`.bak [root@Node1 conf]# ls authz passwd svnserve.conf svnserve.conf.2017-12-13.bak [root@Node1 conf]# vim svnserve.conf [general] #anon-access = read anon-access = none # auth-access = write auth-access = write password-db = /application/svndata/sadoc/conf/passwd authz-db = /application/svndata/sadoc/conf/authz realm = test1
版本庫認證域:
在使用svn客戶端訪問svnserve服務器時,若須要用戶登陸,則提示信息以下:
[root@Python data]# svn checkout svn://192.168.10.1/sadoc Authentication realm: <svn://192.168.10.1:3690> 3b1cbe24-4dd1-455c-9f6b-b1150c555260 Password for 'root':
在上述第2行"Authentication realm: <svn://192.168.10.1:3690>"以後顯示的字符串爲認證域名稱。若是在配置文件中爲設定認證域,就會提示一個UUID,如上述所示。
若是在配置文件中指定了以下配置項:realm = test1
將在svn客戶端提示以下:
[root@Python data]# svn checkout svn://192.168.10.1/sadoc Authentication realm: <svn://192.168.10.1:3690> test1 Password for 'root':
用戶名密碼文件由svnserve.conf的配置項password-db指定,缺省爲conf目錄中的passwd。該文件僅由一個[users]配置段組成。
[users]配置段的配置行格式以下:
<用戶名> = <口令>
注意:配置行中的口令爲未通過任何處理的明文。
例2:用戶名口令文件conf/passwd的內容以下:
[root@Node1 conf]# cp -a passwd passwd.`date +%F`.bak [root@Node1 conf]# vim passwd [users] # harry = harryssecret # sally = sallyssecret admin = admin xxj = 123456 ops = 111 dev = 222
該文件中配置了兩個用戶,用戶名分別爲"admin"等四個用戶。其中"admin"用戶的口令爲"admin"。
權限配置文件由svnserve.conf的配置項authz-db指定,缺省爲conf目錄中的authz。該配置文件由一個[groups]配置段和若干個版本庫路徑權限段組成。
[groups]配置段中配置行格式以下:
<用戶組> = <用戶列表>
用戶列表由若干個用戶組或用戶名構成,用戶組或用戶名之間用逗號","分隔,引用用戶組時要使用前綴"@"(如:引用用戶組"all"要使用字符串"@all")。
注意: 用戶列表中的用戶是要在用戶密碼文件中定義的用戶
版本庫路徑權限段的段名格式以下:
[<版本庫名>:<項目/目錄>]
其中,方框號內部分能夠有多種寫法:
如版本庫abc路徑/tmp的版本庫路徑權限段的段名爲"[abc:/tmp]"。
可省略段名中的版本庫名。若省略版本庫名,則該版本庫路徑權限段對全部版本庫中相同路徑的訪問控制都有效。
如:段名爲"[/tmp]"的版本庫路徑權限段設置了全部引用該權限配置文件的版本庫中目錄"/tmp"的訪問權限。
版本庫路徑權限段中配置行格式有以下三種:
注意:每行配置只能配置單個用戶或用戶組。
例3:權限配置文件conf/authz的內容以下:
[groups] ett_sa = admin,xxj ett_dev = ops,dev [sadoc:/] @ett_sa = rw @ett_dev = r
[root@Python data]# svn checkout --username=xxj --password=123456 svn://192.168.10.1/sadoc ----------------------------------------------------------------------- ATTENTION! Your password for authentication realm: <svn://192.168.10.1:3690> test1 can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the 'store-plaintext-passwords' option to either 'yes' or 'no' in '/root/.subversion/servers'. ----------------------------------------------------------------------- Store password unencrypted (yes/no)? yes Checked out revision 0.
在本節中,詳細介紹了svnserve程序的3個配置文件。SVN管理員能夠經過這3個配置文件設置 SVN 服務的用戶名口令以及對版本庫路徑的訪問權限。這些配置文件保存後就當即生效,不須要重啓svnserve服務。
須要強調的是本文介紹的配置文件只對svnserve服務有效,即客戶端經過前綴爲svn://或svn+ssh://的URL訪問版本庫有效,而對經過前綴http://、https://或file:///的URL無效。
本篇博客主要學習了 SVN 介紹和安裝部署,下篇繼續學習 SVN 客戶端命令使用。
# 4、多版本庫解決方案
當有多個軟件開發項目時,而又只安排一臺SVN服務器,爲了各個項目不影響,就須要在一臺SVN服務器上同時運行多個版本庫,分別管理各個項目組的代碼。
一臺svn服務器上同時運行多個版本庫有2種方案:
單版本庫起動 svnserve -d -r /data/svn_data/repo1多版本庫起動 svnserve -d -r /data/svn_data/