【SVN】1. SVN 安裝部署

一. SVN概述

1. SVN 簡介

  Subversion 版本控制系統 簡稱 SVN。web

  SVN 是一個跨平臺開放源代碼的集中式版本控制系統,能夠實現文件及目錄的保存及版本回溯數據庫

  SVN 管理着隨時間改變的各類數據,這些數據放置在一箇中央檔案庫(repository)中,這個檔案庫很像一個普通的文件服務器或者FTP服務器,不過它會記錄每一次文件的變更。這樣你就能夠把檔案恢復到舊的版本,或是瀏覽文件的變更歷史。apache

  SVN 是一個通用的軟件系統,它不但能夠用來管理程序源碼,也能夠管理任何類型的文件。vim

  SVN 是一種集中式的版本控制系統,它的核心是中央版本庫(repository),存儲全部的數據,版本庫按照文件樹形式存儲數據(包括文件和目錄),任意數量的的客戶端能夠鏈接到版本庫,讀寫這些文件。經過寫數據,別人能夠看到這些,經過讀數據,能夠看到別人的修改。windows

2. svn 運行方式和訪問方式

2.1 運行方式

  1. 獨立服務器  訪問方式:svn://svn.etiantian.org/www
  2. 和 apache 等 http 服務結合  訪問方式:http[s]://svn.etiantian.org/www
  3. csvn(Apache + SVN)是一個整合好的軟件,帶有web管理頁面的svn軟件;
  4. 本地直接訪問  訪問方式:file://application/data/www/

2.2 訪問方式

  • file://   直接訪問本地磁盤或網絡磁盤訪問版本庫
  • http://   經過webdav協議訪問支持subversion的apache服務器
  • https://   與http:// 相似,只是用了ssl加密訪問
  • svn://   經過TCP/IP自定義協議訪問subversion服務器
  • svn+ssh://   經過認證並加密的TCP/IP自定義協議訪問subversion服務器

3. svn 版本庫數據存儲格式

SVN 存儲的數據不能看到文件實體後端

  • BDB:(伯克利 DB)
      subversion 1.2 版本之前默認的存儲方式;可能出現鎖住數據的的問題;安全

  • FSFS:
      一個專用於 SVN 版本庫的文件系統後端,可使用網絡文件系統(NFS,SMBFS),1.2 版本及之後的默認存儲格式。

4. svn 邏輯架構原理圖

【SVN】1. SVN 安裝部署

5. SVN 工做流程

  SVN 是一種集中式版本控制系統。集中式管理的工做流程以下圖:bash

【SVN】1. SVN 安裝部署
  集中式代碼管理的核心是SVN服務器,開發者在開始新一天工做以前必須先在本地update一下代碼,而後開發、解決衝突、合併、提交。全部的版本信息都放在SVN服務器上面。服務器

下面舉例說明:網絡

開始新一天的工做:

  1. 從服務器下載項目組最新代碼。
  2. 進入本身的分支,進行工做,每一個一個小時向服務器上本身的分支提交一次代碼(不少人都有這個習慣。由於有時候本身對代碼改來改去,最後又想還原到前一惡搞小時的版本,或者看看前一個小時本身修改了哪些代碼,就須要這樣作了。)
  3. 下班時間快到了,把本身的分支合併到服務器主分支上,一天的工做完成,並反映給服務器。
     這就是經典的svn 工做流程,從流程上看,有缺點,也有優勢。

缺點:

  1. 服務器壓力大,SVN 數據庫容易暴增
  2. 若是不能鏈接到服務器上,基本上不能夠工做,看上面第二步,若是服務器不能鏈接上,就不能提交、還原、對比等等。
  3. 不適合開源開服(開發人數很是很是多)。可是通常集中式管理的有很是明確的權限管理機制(例如分支訪問限制),能夠實現分層管理,從而很好的解決開發人數衆多的問題。

優勢:

  1. 管理方便,邏輯明確,符合通常人思惟習慣。
  2. 代碼一致性和安全性很是高。
  3. 適合開發人數很少的項目開服。
  4. 大部分軟件配置管理的大學教材都是使用svn。
  5. 學習簡單、使用簡單

二. SVN 安裝

1. SVN 下載

官網 http://subversion.apache.org/

最新穩定版:subversion-1.9.7.tar.gz

在windows環境下,最經常使用VisualSVN server 服務端和 TortoiseSVN(簡稱TSVN)客戶端搭配使用

【SVN】1. SVN 安裝部署

2. SVN 服務端安裝

[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

3. 配置並啓動 SVN

創建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

4. 創建版本庫

[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

三. SVN配置文件詳解

  svnserve經過配置文件來設置用戶和口令,以及按路徑控制版本庫訪問權限。

1. svnserve 配置文件概述

  下面詳細學習svnserve配置文件svnserve.conf的格式,並說明如何使用配置文件控制版本庫訪問權限。

1.1 svnserve 配置文件一般由如下3個文本文件組成:

svn服務配置文件:
  該文件版本庫目錄的conf目錄下,文件名爲svnserve.conf。

用戶密碼配置文件:
  該文件名在文件svnserve.conf中指定,缺省爲同目錄下的passwd。

用戶權限配置文件:
  該文件名也在文件svnserve.conf中指定,缺省爲同目錄下的authz。

2. svn 服務配置文件

  svn服務配置文件爲版本庫目錄中conf/svnserve.conf 文件。該文件僅由[general]和[sasl]配置段組成。

[general]配置段中配置行格式以下:
<配置項> = <值>

配置項分爲如下5項:

  1. anon-access 控制非鑑權用戶(匿名用戶)訪問版本庫的權限。取值範圍爲"write"、"read"和"none"。即"write"爲可讀可寫,"read"爲只讀,"none"表示無訪問權限。缺省值:read
  2. auth-access 控制鑑權用戶訪問版本庫的權限。取值範圍爲"write"、"read"和"none"。即"write"爲可讀可寫,"read"爲只讀,"none"表示無訪問權限。缺省值:write
  3. password-db 指定用戶名口令文件名。除非指定絕對路徑,不然文件位置爲相對conf目錄的相對路徑。缺省值:passwd
  4. authz-db 指定權限配置文件名,經過該文件能夠實現以路徑爲基礎的訪問控制。除非指定絕對路徑,不然文件位置爲相對conf目錄的相對路徑。缺省值:authz
  5. realm 指定版本庫的認證域,即在登陸時提示的認證域名稱。若兩個版本庫的認證域相同,建議使用相同的用戶名口令數據文件。 缺省值:一個UUID(Universal Unique IDentifier,全局惟一標示)。

注意: 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':

3. 用戶密碼文件

  用戶名密碼文件由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"。

4. 權限配置文件

  權限配置文件由svnserve.conf的配置項authz-db指定,缺省爲conf目錄中的authz。該配置文件由一個[groups]配置段和若干個版本庫路徑權限段組成。

[groups]配置段中配置行格式以下:
<用戶組> = <用戶列表>
  用戶列表由若干個用戶組或用戶名構成,用戶組或用戶名之間用逗號","分隔,引用用戶組時要使用前綴"@"(如:引用用戶組"all"要使用字符串"@all")。

注意: 用戶列表中的用戶是要在用戶密碼文件中定義的用戶

版本庫路徑權限段的段名格式以下:
[<版本庫名>:<項目/目錄>]

  其中,方框號內部分能夠有多種寫法:

  1. [/],表示根布幕及如下,根目錄是svnserve啓動時指定的,咱們指定爲/application/svndata,[/]就是表示對所有版本庫設置權限
  2. [repos:/],表示對版本庫repos設置權限
  3. [repos:/sadoc] 表示對版本庫repos中sadoc目錄設置權限

如版本庫abc路徑/tmp的版本庫路徑權限段的段名爲"[abc:/tmp]"。
可省略段名中的版本庫名。若省略版本庫名,則該版本庫路徑權限段對全部版本庫中相同路徑的訪問控制都有效。
如:段名爲"[/tmp]"的版本庫路徑權限段設置了全部引用該權限配置文件的版本庫中目錄"/tmp"的訪問權限。

版本庫路徑權限段中配置行格式有以下三種:

  • <用戶名> = <權限>
  • @<用戶組> = <權限>
    • = <權限>
        其中,"*"表示任何用戶;權限的取值範圍爲''w"、'r'和'rw'和空,空表示對該版本庫路徑無任何權限,'r'表示具備只讀權限,'rw'表示有讀寫權限。

注意:每行配置只能配置單個用戶或用戶組。

例3:權限配置文件conf/authz的內容以下:

[groups]
ett_sa = admin,xxj
ett_dev = ops,dev

[sadoc:/]
@ett_sa = rw
@ett_dev = r

5. SVN 客戶端鏈接服務器

[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.

6. 總結

  在本節中,詳細介紹了svnserve程序的3個配置文件。SVN管理員能夠經過這3個配置文件設置 SVN 服務的用戶名口令以及對版本庫路徑的訪問權限。這些配置文件保存後就當即生效,不須要重啓svnserve服務。
  須要強調的是本文介紹的配置文件只對svnserve服務有效,即客戶端經過前綴爲svn://或svn+ssh://的URL訪問版本庫有效,而對經過前綴http://、https://或file:///的URL無效


  本篇博客主要學習了 SVN 介紹和安裝部署,下篇繼續學習 SVN 客戶端命令使用。

# 4、多版本庫解決方案

  當有多個軟件開發項目時,而又只安排一臺SVN服務器,爲了各個項目不影響,就須要在一臺SVN服務器上同時運行多個版本庫,分別管理各個項目組的代碼。

  
一臺svn服務器上同時運行多個版本庫有2種方案:

  • 在SVN服務器上建立多個版本庫,同時運行多個svnserve進程,分別監聽不一樣的端口。客戶端鏈接此服務器不一樣端口便可鏈接不一樣的版本庫。
  • SVN版本庫起動方式,如今/data/svn_data下面有repo1,repo2兩個版本庫

單版本庫起動 svnserve -d -r /data/svn_data/repo1多版本庫起動 svnserve -d -r /data/svn_data/

相關文章
相關標籤/搜索