天天看點

subversion安裝、備份、安全認證明踐筆記——宋轶聰

在windows上配置svn的方法

在linux 10.117.100.130 上安裝svn

svn庫的導入導出

檢視svn伺服器版本

SVN備份政策

Svn 服務配置和維護常用指令

linux下啟動和停止

win下啟動和停止svn

把svn加為系統服務

配置apache通過http通路svn

svn 指令行

====================================在windows上的配置方法===============================================================

1.    環境和軟體準備

Window-Subvsersion : http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91

2.    配置管理

2.1. 建立倉庫 (svnadmin)

在硬碟上建立個空目錄,作為 SVN 的倉庫目錄。如: E:/svnroot/repository 。

下面使用兩種方式建立倉庫的初時檔案結構和存儲方式。

  • 指令方式
  • TortoiseSVN 用戶端方式,

後面所有文檔都采用兩種方式說明,其功能完全相同。請根據實際情況選擇使用。

指令方式( DOS 下):

# 預設方式,采用 FSFS 方式存儲資料,這是推薦方式,管理和遷移相對 bdb 方式簡單

svnadmin create E:/svnroot/repository

svnadmin create &endash;fs-type bdb E:/svnroot/repository

上為bdb的檔案系統方式, 一般預設是native的FS即 NTFS

TortoiseSVN 用戶端方式

安裝TortoiseSVN

建立空目錄

進入空目錄,右鍵TortoiseSVN 》建立庫here

2.2. 配置服務

進入倉庫目錄下的 conf 檔案夾。也就是 E:/svnroot/repository/conf

裡面有 3 個預設的配置檔案: authz , passwd , svnserve.conf

  • authz 典型的配置是設定由 authz 控制授權,即哪個組可以對這個目錄有什麼權限
  • svnserve.conf 控制 svnserve 的啟動配置選項,可以配置認證和授權方式,
  • passwd 控制認證的方式來控制通路權限。也可以使用匿名方式,但不推薦。所有使用者和密碼

使用 authz 和 passwd 的典型配置:

請特别注意:以下三個配置檔案的配置,每行有效配置前不能有空格,不然配置會失敗。

------------------------------------------服務配置檔案 svnserve.conf-----------------------------------------------------

&ldots;&ldots;

### 匿名方式不允許通路

anon-access = none

&ldots;&ldots;

### Uncomment the line below to use the default password file.

### 表示通路倉庫的認證有檔案 passwd 提供的賬戶确定

password-db = passwd

&ldots;&ldots;

### Uncomment the line below to use the default authorization file.

### 表示認證後的賬戶通路權限由檔案 authz 定義

authz-db = authz

### This option specifies the authentication realm of the repository.

&ldots;&ldots;

#realm = My First Repository

--------------------------------------------認證配置檔案 passwd--------------------------------------------------------------

passwd 檔案實際提供通路本倉庫的賬戶管理,檔案格式就是 ini 方式的格式

[users]

# harry = harryssecret

# sally = sallyssecret

testuser1=testuser1

testuser2=testuser2

這表示本倉庫配置了二個使用者及:其中一個使用者 testuser1, 他的通路密碼是 testuser1。

通路密碼可以使用明文,也可以使用 htpasswd.exe ( apache 伺服器提供的工具方法,安裝 apache 伺服器後,在其 bin 目錄中有該程式檔案)進行加密處理。

--------------------------------------------授權配置檔案 authz----------------------------------------------------------------

該檔案負責認證後的使用者的權限控制,配置稍微複雜,但其實也就是個 ini 配置檔案而已。

典型配置:

# groups 段提供配置組的功能 , 但組成員必須是 passwd 檔案中定義的使用者才有效。可以對組

# 進行權限控制,所有組成員具有組對應的通路權限。

[groups]

# 表示定義了一個管理組叫 admin_group, 包括 harry 和 sally , admin_group 前千萬不能有空格

admin_group=testuser1

dev_group=testuser2

# 下面就是定義具體倉庫下目錄的通路權限

# 一般對管理者來說都具有整個倉庫的讀寫權限,一般人員對整個敞開具有讀取權限,下面

# 就是這樣的配置 ,[/] 表示整個倉庫的根,組的引用使用 @ ,對應的權限可以是 r,w,rw 或空

[/]

@admin_group = rw

@dev_group = rw

* = r

[/test_project]

@admin_group = rw

@dev_group = rw

* = r

[repository:/]

@admin_group = rw

@dev_group = rw

* = r

以上的配置完成後,就可以啟動伺服器了,下面說明伺服器的啟動。

注意,以上 authz 和 passwd 檔案在管理中因為具體項目的加入和人員的變動會經常的修改,這也是 SVN 管理主要的工作

2.3. 啟動服務 (svnserve)

Svn 伺服器一般有三種方式, svnserve , apache 和 SSH 。

其中常用的有 svnserve 和 apache 方式。本文隻以 svnserve 方式講解。

  • svnserve 是最高效的方式,一般應用于内部開發網中使用。
  • Apache 方式因為可以很好的部署在 internet 上,是以公網使用最友善,但配置稍微相對複雜點點,呵呵~~。
  • ssh方式

指令方式( DOS 下)啟動:

svnserve &endash;d &endash;r "E:/svnroot/repository"

-d 參數是以獨立服務的方式啟動

-r 是制訂要加載的倉庫的實體路徑

添加為Windows系統服務

方法1(推薦):

在Windows NT中(包括Windows XP, Windows 2000, Windows 2003 Server, Windows vista)本身包含了一個安裝服務的工具,叫做"Service Control",也就是sc.exe。

1.安裝為服務:

例:我的Subversion安裝在"C:/Program Files/Subversion",版本庫在"E:/svnroot/repository",

而我希望對應的Subversion服務名為svnservice,安裝這個svn服務的指令就可以這樣寫:

SC create svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service --root /"E:/svnroot/repository/"" displayname= "SVNService" depend= Tcpip start= auto   配置為自啟動服務

在以前啟動svnserve時會使用"-d"選項,也就是守護程序模式,在這裡不能使用,會導緻服務無法啟動。同樣,"-i"和"-t"選項也不能使用。

另外還有兩點需要小心處理。

  • 首先,如果路徑中包括空格,一定要用”r;/”處理雙引号,例如上面的例子中如果svnserve.exe在

”r;C: /Program Files/Subversion/bin/svnserve.exe”中,則指令應該寫為”r;binpath= "/"C:/Program Files/Subversion/bin/svnserve.exe/"”(”r;”中的内容):

SC create svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service --root /"E:/svnroot/repository/"" displayname= "SVNService" depend= Tcpip

  • 其次,sc對選項的格式還有要求,例如”r;depend= Tcpip”不能寫為”r;depend = Tcpip”或”r;depend=Tcpip”,也就是”r;=”前不能有空格,而後面必須有空格。

2.啟動服務

在指令行視窗執行完這個指令之後,服務還沒有啟動,你可以繼續運作"net start svnservice"啟動這個服務。

3.停止服務

然後使用"net stop svnservice"停止服務。

4.删除服務

如果服務安裝的有問題,你可能需要删除服務。要删除前面添加的服務,隻需要運作"sc delete svnservice",

"svnservice"就是我們建立服務時使用的名字。

5.配置服務是自動啟動

預設情況下安裝的服務不會随Windows的啟動而啟動,為了使svn服務能夠随Windows啟動而啟動,

需要修改一下"sc create"指令(首先要删除),增加"start= auto"選項:

 SC create svnservice binPath= "/"C:/Program Files/Subversion/bin/svnserve.exe/" --service --root /"E:/svnroot/repository/"" displayname= "SVNService" depend= Tcpip start= auto

當然你也可以使用圖形化的工具修改服務的屬性,你可以在”r;開始->運作...”中執行"services.msc",然後在界面中修改。

在vista下要以管理者的權限運作CMD, 否則會出現權限問題.

=================================在linux 10.117.100.130 上安裝svn===============================================================

1、下載下傳svn for linux 最新版           http://subversion.tigris.org

2、連接配接vpn并使用sshsecure client上傳

3、使用cat /proc/version  檢視系統是什麼Linux,

結果顯示是centos

4、檢視磁盤使用情況

[[email protected] ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/mapper/vgroot-root

                       6887724   1757136   4775056  27% /

/dev/mapper/vgehong-ehong                                                                            邏輯卷

                      20282620    176200  19059484   1% /usr/local/ehong

/dev/sda1               194442     14424    169979   8% /boot

tmpfs                  2022252         0   2022252   0% /dev/shm

5、解壓縮并安裝

  1. 解壓:#: tar zxvf subversion-1.3.2.tar.gz
  2. 依次輸入./configure , make , make install 進行編譯安裝完成。
  3. 開啟SVN服務:svnserve -d
  4. 檢測服務是否開啟:netstat -ntlp如果看到3690的端口正常開放了,證明SVN啟動了。

tar xfj subversion-1.4.3.tar.bz2

tar xfj subversion-deps-1.4.3.tar.bz2

# subversion-deps的檔案也會解壓到subversion-1.4.3目錄中

cd subversion-1.4.3

rm -rf apr

rm -rf apr-util

ln -s /home/tmp/httpd-2.2.4/srclib/apr apr

ln -s /home/tmp/httpd-2.2.4/srclib/apr-util apr-util

./configure && make && make install

安裝完成後,檢視是否存在檔案$APACHE_HOME/modules/mod_dav_svn.so(預設/usr/local/apache2/modules/mod_dav_svn.so)。另外,如果該機器上以前是裝過舊版本的SVN,要把"/usr/local/lib/libsvn*"檔案都删除。

正式使用前準備:

首先我們得建立一個SVN的項目,一般人都認為建立項目就隻需要一個檔案,在我第一次使用SVN之前都有這樣的看法,SVN建立項目需要建立檔案夾

  1. 建立項目指令:svnadmin create project_name project_name 為你的project名字,可以任意取。

建立完畢後,project_name是一個檔案夾,進入檔案夾,可以看到一個conf的檔案夾。

    2.進入檔案夾可以看到2個檔案(如果沒有passwd檔案,可以用vi建立),編輯 svnserve.conf 把anon-access = read ,auth_access = write

還有password-db = passwd 的注釋去掉,還有[general]的注釋也要去掉。

vi passwd檔案,如果是新檔案,則輸入:

[user]

your_name = your_password

這裡設定的your_name是你的使用者名,your_password是你的密碼,這個是通路SVN必要的通行證。

好了,現在終于把準備功夫做完了,

下面可以正是使用了。

首先找到你的項目源代碼檔案夾,使用下面指令:

cd your project

in your project dircetory

use:svn co /home/project_name --username = your_name --password=your_password

好了,現在你可以在客戶機上使用以下指令獲得你想要的項目源代碼檔案

svn co svn://home/project_name --username=your_name --password = your_password

把增加的svn檔案添加入svn庫:

svn add /home/your_project/*.* --username=your_name --password = your_password

送出檔案:

svn commit /home/your_project/*.* --username=your_name --password=your_password

更新檔案:

svn update /home/your_project/*.* --username=your_name --password=your_password

當然你可以編輯一個腳本檔案來一次完成所有的操作:

vi svnupdate.sh

#!/bin/sh

svn add /home/your_project/*.* --username=your_name --password = your_password

svn commit /home/your_project/*.* --username=your_name --password=your_password

svn update /home/your_project/*.* --username=your_name --password=your_password

chmod +x svnupdate.sh

Finish

=====================================svn庫的導入導出============================================================================

svn提供了一個類似oracle export成dump檔案的一個工具svnadmin dump,導出的檔案為文本檔案

//導出

1、首先進入庫的相應目錄

cd e:/svnroot

2、導出/java-source所有檔案到

E:/svnroot>svnadmin dump ./java-source > java-dump

3、将java-dump上傳到

//還原

$svnadmin load java-source < java-dump

ok成功導入。

停止subversion服務

ps &endash;aux | grep svnserve

kill -9 ID号

檢視svn伺服器版本

C:/Documents and Settings/server>svnadmin --version                        用svn --version效果一樣

svnadmin,版本 1.5.6 (r36142)

   編譯于 Mar  6 2009,14:54:47

版權所有 (C) 2000-2008 CollabNet。

Subversion 是開放源代碼軟體,請參閱 http://subversion.tigris.org/ 站點。

此産品包含由 CollabNet(http://www.Collab.Net/) 開發的軟體。

下列版本庫後端(FS) 子產品可用:

* fs_base : 子產品隻能操作BDB版本庫。

* fs_fs : 子產品與文本檔案(FSFS)版本庫一起工作。

[[email protected] ~]# svn --version

svn, version 1.6.11 (r934486)

   compiled Apr 20 2010, 00:24:22

Copyright (C) 2000-2009 CollabNet.

Subversion is open source software, see http://subversion.tigris.org/

This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.

  - handles 'http' scheme

  - handles 'https' scheme

* ra_svn : Module for accessing a repository using the svn network protocol.

  - with Cyrus SASL authentication

  - handles 'svn' scheme

* ra_local : Module for accessing a repository on local disk.

  - handles 'file' scheme

====================================SVN備份政策=============================================================================

文章摘要:Subversion适合于規模一般(幾十開發人員)的項目代碼的版本管理工作。使用體驗較VSS、CVS等好,推薦在選擇版本管理工具時可以試用一下。

安裝Subversion

        1 安裝svn-1.4.0-setup。

        2 将SVN配置成服務。

(本文例子基于FreeBSD/Linux實作,windows環境請自己做出相應修改)

   配置管理的一個重要使命是保證資料的安全性,防止伺服器應硬碟損壞、誤操作造成資料無法恢複的災難性後果。是以制定一個完整的備份政策非常重要。

一般來說,備份政策應規定如下幾部分内容:備份頻度、備份方式、備份存放地點、備份責任人、災難恢複檢查措施及規定。

   備份頻度、存放地點等内容可以根據自己的實際情況自行制定;本文重點描述備份方式。

   svn備份一般采用三種方式:1)svnadmin dump 2)svnadmin hotcopy 3)svnsync.

注意,svn備份不宜采用普通的檔案拷貝方式(除非你備份的時候将庫暫停),如copy指令、rsync指令。

筆者曾經用 rsync指令來做增量和全量備份,在季度備份檢查審計中,發現備份出來的庫大部分都不可用,是以最好是用svn本身提供的功能來進行備份。

優缺點分析:

==============

第一種svnadmin dump是官方推薦的備份方式,優點是比較靈活,可以全量備份也可以增量備份,并提供了版本恢複機制。

   缺點是:如果版本比較大,如版本數增長到數萬、數十萬,那麼dump的過程将非常慢;備份耗時,恢複更耗時;不利于快速進行災難恢複。

   個人建議在版本數比較小的情況下使用這種備份方式。

第二種svnadmin hotcopy原設計目的估計不是用來備份的,隻能進行全量拷貝,不能進行增量備份;

優點是:備份過程較快,災難恢複也很快;如果備份機上已經搭建了svn服務,甚至不需要恢複,隻需要進行簡單配置即可切換到備份庫上工作。

缺點是:比較耗費硬碟,需要有較大的硬碟支援(俺的備份機有1TB空間,呵呵)。

第三種svnsync實際上是制作2個鏡像庫,當一個壞了的時候,可以迅速切換到另一個。不過,必須svn1.4版本以上才支援這個功能。

   優點是:當制作成2個鏡像庫的時候起到雙機實時備份的作用;

   缺點是:當作為2個鏡像庫使用時,沒辦法做到”r;想完全抛棄今天的修改恢複到昨晚的樣子”;而當作為普通備份機制每日備份時,操作又較前2種方法麻煩。   

下面具體描述這三種的備份的方法:

===============

1、svnadmin dump備份工具

------------------------

這是subversion官方推薦的備份方式。

1)定義備份政策:

   備份頻度:每周六進行一次全量備份,每周日到周五進行增量備份

   備份地點:備份存儲路徑到/home/backup/svn/

   備份命名:全量備份檔案名為:weekly_fully_backup.yymmdd,增量備份檔案命名為:daily-incremental-backup.yymmdd

   備份時間:每晚21點開始

   備份檢查:每月末進行svnadmin load恢複試驗。

2)建立全量備份腳本:

   在~/下建立一個perl腳本檔案,名為weekly_backup.pl,執行全量備份,并壓縮備份檔案,代碼如下(本代碼隻針對一個庫的備份,如果是多個庫請做相應改動):

#!/usr/bin/perl -w

my $svn_repos="/home/svn/repos/project1";

my $backup_dir="/home/backup/svn/";

my $next_backup_file = "weekly_fully_backup.".`date +%Y%m%d`;

$youngest=`svnlook youngest $svn_repos`;

chomp $youngest;

print "Backing up to revision $youngestn";

my $svnadmin_cmd="svnadmin dump --revision $youngest $svn_repos >$backup_dir/$next_backup_file";

`$svnadmin_cmd`;

open(LOG,">$backup_dir/last_backed_up"); #記錄備份的版本号

print LOG $youngest;

close LOG;

#如果想節約空間,則再執行下面的壓縮腳本

print "Compressing dump file...n";

print `gzip -9 $backup_dir/$next_backup_file`;

   3)建立增量備份腳本:

在全量備份的基礎上,進行增量備份:在~/下建立一個perl腳本檔案,名為:daily_backup.pl,代碼如下:

#!/usr/bin/perl -w

my $svn_repos="/home/svn/repos/project1";

my $backup_dir="/home/backup/svn/";

my $next_backup_file = "daily_incremental_backup.".`date +%Y%m%d`;

open(IN,"$backup_dir/last_backed_up");

$previous_youngest = <IN>;

chomp $previous_youngest;

close IN;

$youngest=`svnlook youngest $svn_repos`;

chomp $youngest;

if ($youngest eq $previous_youngest)

{

   print "No new revisions to backup.n";

   exit 0;

}

my $first_rev = $previous_youngest + 1;

print "Backing up revisions $youngest ...n";

my $svnadmin_cmd = "svnadmin dump --incremental --revision $first_rev $youngest $svn_repos > $backup_dir/$next_backup_file";

`$svnadmin_cmd`;

open(LOG,">$backup_dir/last_backed_up"); #記錄備份的版本号

print LOG $youngest;

close LOG;

#如果想節約空間,則再執行下面的壓縮腳本

print "Compressing dump file...n";

print `gzip -g $backup_dir/$next_backup_file`;

4)配置/etc/crontab檔案

配置 /etc/crontab 檔案,指定每周六執行weekly_backup.pl,指定周一到周五執行daily_backup.pl;

具體步驟俺就不啰嗦了.

5)備份恢複檢查

在月底恢複檢查中或者在災難來臨時,請按照如下步驟進行恢複:恢複順序從低版本逐個恢複到高版本;即,先恢複最近的一次完整備份 weekly_full_backup.071201(舉例),然後恢複緊挨着這個檔案的增量備份 daily_incremental_backup.071202,再恢複後一天的備份071203,依次類推。如下:

user1>mkdir newrepos

user1>svnadmin create newrepos

user1>svnadmin load newrepos < weekly_full_backup.071201

user1>svnadmin load newrepos < daily_incremental_backup.071202

user1>svnadmin load newrepos < daily_incremental_backup.071203

....

如果備份時采用了gzip進行壓縮,恢複時可将解壓縮和恢複指令合并,簡單寫成:

user1>zcat weekly_full_backup.071201 | svnadmin load newrepos

user1>zcat daily_incremental_backup.071202 | svnadmin load newrepos

...

(這部分内容很多參考了《版本控制之道》)

2、svnadmin hotcopy整庫拷貝方式

-------------------------

svnadmin hotcopy是将整個庫都”r;熱”拷貝一份出來,包括庫的鈎子腳本、配置檔案等;任何時候運作這個腳本都得到一個版本庫的安全拷貝,不管是否有其他程序正在使用版本庫。

是以這是俺青睐的備份方式。

   1)定義備份政策

備份頻度:每天進行一次全量備份,

備份地點:備份目錄以日期命名,備份路徑到 /home/backup/svn/${mmdd}

備份保留時期:保留10天到15天,超過15天的進行删除。

備份時間:每晚21點開始

備份檢查:備份完畢後自動運作檢查腳本、自動發送報告。

   2)建立備份腳本

   在自己home目錄 ~/下建立一個檔案,backup.sh:

#!/bin/bash

SRCPATH=/home/svn/repos/; #定義倉庫parent路徑

DISTPATH=/home/backup/svn/`date +%m%d`/ ; #定義存放路徑;

if [ -d "$DISTPATH" ]

then

else

mkdir $DISTPATH

chmod g+s $DISTPATH

fi

echo $DISTPATH

svnadmin hotcopy $SRCPATH/Project1 $DISTPATH/Project1 >/home/backup/svn/cpreport.log 2>&1;

svnadmin hotcopy $SRCPATH/Project2 $DISTPATH/Project2

cp $SRCPATH/access   $DISTPATH; #備份access檔案

cp $SRCPATH/passwd   $DISTPATH; #備份passwd檔案

perl /home/backup/svn/backup_check.pl #運作檢查腳本

perl /home/backup/svn/deletDir.pl   #運作删除腳本,對過期備份進行删除。

   3)建立檢查腳本

   在上面指定的地方/home/backup/svn/下建立一個perl腳本:backup_check.pl

備份完整性檢查的思路是:對備份的庫運作 svnlook youngest,如果能正确列印出最新的版本号,則表明備份檔案沒有缺失;如果運作報錯,則說明備份不完整。我試過如果備份中斷,則運作svnlook youngest會出錯。

   perl腳本代碼如下:

#! /usr/bin/perl

## Author:xuejiang

## 2007-11-10

## http://www.scmbbs.com

use strict;

use Carp;

use Net::SMTP;

#### defined the var #######

my $smtp =Net::SMTP->new('mail.scmbbs.com', Timeout => 30, Debug => 0)|| die "cann't connect to mail.scmbbs.comn";

my $bkrepos="/home/backup/svn/".&get_day;#定義備份路徑

my $ssrepos="http://www.scmbbs.com/repos";#定義倉庫url

my @repos = ("project1","project2");

my $title="echo "如下是昨晚備份結果與真實庫對比的情況,如果給出備份版本數,則表示備份成功;如果給報錯資訊或沒有備份版本數,則表示備份失敗:" >./report";

system $title   || die "exec failedn";

foreach my $myrepos(@repos)

{

my $bkrepos1=$bkrepos."/".$myrepos;

   my $ssrepos1=$ssrepos."/".$myrepos;

   my $svnlookbk1 = "echo "$myrepos 昨晚備份的版本是:">>./report;svnlook youngest ".$bkrepos1." >> ./report 2>&1";

   my $svnlookss1 = "echo "$myrepos 真實庫中的最新版本及最後修改時間是:">>./report;svn log -r'HEAD' ".$ssrepos1." >> ./report 2>&1";

   system $svnlookbk1 || die "exec failedn";

   system $svnlookss1 || die "exec failedn";

}

my $body    ="echo "=========================================================================" >>./report";

my $bottom     ="echo "備份位置:來自http://www.scmbbs.com的".$bkrepos."" >>./report";

system $body    || die "exec failedn";

system $bottom     || die "exec failedn";

###### report the result ####

open(SESAME,"./report")|| die "can not open ./report";

my @svnnews = <SESAME>;

close(SESAME);

foreach my $line1 (@svnnews)

{

   print $line1."n";

}

my @email_addresses =("[email protected]","[email protected]","[email protected]");

my $to              = join(', ', @email_addresses);

$smtp->mail("[email protected]");

$smtp->recipient(@email_addresses);

$smtp->data();

$smtp->datasend("Toton");

$smtp->datasend("From: [email protected]");

$smtp->datasend("Subject:svn備份檢查報告".&get_today."n");

$smtp->datasend("Reply-to:[email protected]");

$smtp->datasend("@svnnews");

$smtp->dataend();

$smtp->quit;

#############

sub get_today

{

my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );

$year += 1900;

$month++;

my $today = sprintf( "%04d%02d%02d", $year, $month, $day);

return $today;

}

sub get_day

{

my( $sec, $min, $hour, $day, $month, $year ) = localtime( time() );

$year += 1900;

$month++;

my $today = sprintf( "%02d%02d", $month, $day);

return $today;

}

   4)定義删除腳本

由于是全量備份,是以備份不宜保留太多,隻需要保留最近10來天的即可,對于超過15天曆史的備份基本可以删除了。

在/home/backup/svn/下建立一個perl腳本:deletDir.pl

(注意,删除svn備份庫可不像删除普通檔案那麼簡單)

5)修改/etc/crontab 檔案

在該檔案中指定每晚21點執行”r;backup.sh”腳本。

3、svnsync備份

-----------------------

   使用svnsync備份很簡單,步驟如下:

1)在備份機上建立一個空庫:

svnadmin create svnbackup

2)更改該庫的鈎子腳本pre-revprop-change(因為svnsync要改這個庫的屬性,也就是要将源庫的屬性備份到這個庫,是以要啟用這個腳本):

   cd SMP/hooks;

   cp pre-revprop-change.tmpl pre-revprop-change;

   chmod 755 pre-revprop-change;

   vi pre-revprop-change;

   将該腳本後面的三句注釋掉,或者幹脆将它弄成一個空檔案。

3)初始化,此時還沒有備份任何資料:

svnsync init file:///home/backup/svn/svnsync/svnbackup/   http://svntest.subversion.com/repos/svnbackup

   文法是:svnsync init {你剛建立的庫url} {源庫url}

   注意本地url是三個斜杠的:///

4)開始備份(同步):

   svnsync sync file:///home/backup/svn/svnsync/svnbackup

5)建立同步腳本

   備份完畢後,建立鈎子腳本進行同步。在源庫/hooks/下建立/修改post-commit腳本,在其中增加一行,内容如下:

/usr/bin/svnsync sync   --non-interactive file:///home/backup/svn/svnsync/svnbackup

   你可能已經注意到上面的備份似乎都是本地備份,不是異地備份。實際上,我是通過将遠端的備份機mount(請參閱mount指令)到svn伺服器上來實作的,

邏輯上看起來是本地備份,實體上實際是異地備份。

轉載自:http://hi.baidu.com/it198/blog/item/69c407d1e5ca7bda572c8429.html

--------------------------------------------------------------------------------

Subversion獨立服務和與apache整合服務。

1、Svn獨立服務安裝

作業系統: Redhat Linux AS3  AS 4   ContOS AS 4

安裝包擷取:

下載下傳[url]http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz[/url]和[url]http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz[/url]。

編譯:

以root使用者登入。

将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz傳到伺服器。

tar xfvz subversion-1.4.0.tar.gz

tar xfvz subversion-deps-1.4.0.tar.gz

subversion-deps包有四個目錄zlib apr apr-util neon這四個目錄都是依賴包,編譯subversion所必須的代碼

cd subversion-1.4.0

./configure &endash;prefix=/opt/svn &endash;without-berkeley-db &endash;with-zlib

(注:以svnserve方式運作,不加apache編譯參數。以fsfs格式存儲版本庫,不編譯berkeley-db)

make clean

make

make install

vi /etc/profile,在/etc/profile最後加入:

PATH=$PATH:/opt/svn/bin

export PATH

測試:

svnserve &endash;version

如果顯示如下,安裝成功:

svnserve, version 1.4.0 (r21228)

compiled Oct 12 2006, 10:18:56

Copyright (C) 2000-2006 CollabNet.

Subversion is open source software, see [url]http://subversion.tigris.org/[/url]

This product includes software developed by CollabNet ([url]http://www.Collab.Net/[/url]).

The following repository back-end (FS) modules are available:

* fs_fs : Module for working with a plain file (FSFS) repository.

2. svn配置

建立版本庫目錄,可建多個:

mkdir -p /opt/svndata/repos1

mkdir -p /opt/svndata/repos2

建立版本庫:

svnadmin create /opt/svndata/repos1

svnadmin create /opt/svndata/repos2

修改版本庫配置檔案:

版本庫1:

vi /opt/svndata/repos1/conf/svnserve.conf

内容修改為:

[general]

anon-access = none

auth-access = write

password-db = /opt/svn/conf/pwd.conf

authz-db = /opt/svn/conf/authz.conf

realm = repos1

版本庫2:

vi /opt/svndata/repos2/conf/svnserve.conf

内容修改為:

[general]

anon-access = none

auth-access = write

password-db = /opt/svn/conf/pwd.conf

authz-db = /opt/svn/conf/authz.conf

realm = repos2

即除realm = repos2外,其他與版本庫1配置檔案完全相同。如果有更多的版本庫,依此類推。

配置允許通路的使用者:

vi /opt/svn/conf/pwd.conf

為了簡化配置,2個版本庫共用1個使用者配置檔案。如有必要,也可以分開。

注意:對使用者配置檔案的修改立即生效,不必重新開機svn。

檔案格式如下:

[users]

<使用者1> = <密碼1>

<使用者2> = <密碼2>

其中,[users]是必須的。下面列出要通路svn的使用者,每個使用者一行。示例:

[users]

alan = password

king = hello

配置使用者通路權限:

vi /opt/svn/conf/authz.conf

為了簡化配置,3個版本庫共用1個權限配置檔案/opt/svn/conf/pwd.conf。如有必要,也可以分開。檔案中定義使用者組和版本庫目錄權限。

注意:

* 權限配置檔案中出現的使用者名必須已在使用者配置檔案中定義。

* 對權限配置檔案的修改立即生效,不必重新開機svn。

使用者組格式:

[groups]

<使用者組名> = <使用者1>,<使用者2>

其中,1個使用者組可以包含1個或多個使用者,使用者間以逗号分隔。

版本庫目錄格式:

[<版本庫>:/項目/目錄]

@<使用者組名> = <權限>

<使用者名> = <權限>

其中,方框号内部分可以有多種寫法:

/,表示根目錄及以下。根目錄是svnserve啟動時指定的,我們指定為/opt/svndata。這樣,/就是表示對全部版本庫設定權限。

repos1:/,表示對版本庫1設定權限

repos2:/abc, ,表示對版本庫2中的abc項目設定權限

repos2:/abc/aaa, ,表示對版本庫2中的abc項目的aaa目錄設定權限

權限主體可以是使用者組、使用者或*,使用者組在前面加@,*表示全部使用者。權限可以是w、r、wr和空,空表示沒有任何權限。

示例:

[groups]

admin = alan

[/]

@admin = rw

[repos1:/abc/aaa]

king = rw

[repos2:/pass]

king =

删除無用檔案:

rm /opt/svndata/repos1/conf/authz

rm /opt/svndata/repos1/conf/passwd

rm /opt/svndata/repos2/conf/authz

rm /opt/svndata/repos2/conf/passwd

3. 啟動svn

建立啟動svn的使用者:

useradd svn

passwd svn

根據提示為使用者svn設定密碼

允許使用者svn通路版本庫:

chown -R svn:svn /opt/svndata

chown -R svn:svn /opt/data

啟動svn:

su - svn -c ”r;svnserve -d &endash;listen-port 9999 -r /opt/svndata”

其中:

su - svn表示以使用者svn的身份啟動svn

-d表示以daemon方式(背景運作)運作

&endash;listen-port 9999表示使用9999端口,可以換成你需要的端口。但注意,使用1024以下的端口需要root權限

-r /opt/svndata指定根目錄是/opt/svndata

檢查:

ps -ef|grep svnserve

如果顯示如下,即為啟動成功:

svn    6941   1 0 15:07 ?    00:00:00 svnserve -d &endash;listen-port 9999 -r /opt/svndata

二、svn服務與apache 整合

Subversion存儲方式,一是Berkeley DB伯克利存儲方式,二是fsfs存儲方式。兩種版本庫資料存儲對照表特性 Berkeley DB FSFS

對操作中斷的敏感 很敏感;系統崩潰或者權限問題會導緻資料庫”r;塞住”,需要定期進行恢複。 不敏感

可隻讀加載 不能 可以

存儲平台無關 不能 可以

可從網絡檔案系統通路 不能 可以

版本庫大小 稍大 稍小

擴充性:修訂版本樹數量 無限制 某些本地檔案系統在處理單一目錄包含上千個條目時會出現問題。

擴充性:檔案較多的目錄 較慢 較慢

檢出最新代碼的速度 較快 可以

大量送出的速度 較慢,但時間被配置設定在整個送出操作中 較快,但最後較長的延時可能會導緻用戶端操作逾時

組通路權處理 對于使用者的 umask 設定十分敏感,最好隻由一個使用者通路。 對 umask 設定不敏感

功能成熟

1、安裝APR-1.2.7和APR-util-1.2.7

    下載下傳位址:[url]http://apr.apache.org/ [/url]   

    tar zxvf  apr-1.2.7.tar.gz

   ./configure

    make

    make install

我下載下傳的是tar.bz2格式的,用上面的方法解壓失敗。經研究,解決方法如下:

z用來解壓.tar.gz的檔案,.tar.bz2的檔案得換成j,象這樣:

tar   -xjvf   linux-2.6.20.tar.bz2

看看參數說明:

x:解壓

j:bz2

f:指定檔案

這個包不行,不過學了一種解壓的方法也算有收獲

    tar zxvf apr-util-1.2.7.tar.gz

    ./configure --with-apr=/usr/local/apr/

     make

     make install

2、編譯安裝APACHE。

    tar zxvf httpd-2.2.3.tar.gz

    cd httpd-2.2.3

   ./configure --prefix=/opt/apache --enable-dav --enable-so --enable-maintainer-mode --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config

     make

     make install

3、安裝subversion-1.4.0

     tar zxvf subversion-1.4.0.tar.gz

    ./configure --with-apxs=/opt/apache/bin/apxs --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr

問題:有關共享庫錯誤方法:  echo "/usr/local/apr-util/lib" >> /etc/ld.so.c            ldconfig      echo $?

    make

    make install

   設定環境變量(可做可不做)vi /etc/profile,在/etc/profile最後加入:

PATH=$PATH:/opt/svn/bin

export PATH

4、檢視subversion兩個動态庫有沒有安裝成功

     vi /opt/apache/conf/httpd.conf

    看到下面兩個子產品說明安裝成功

     LoadModule dav_svn_module     modules/mod_dav_svn.so

     LoadModule authz_svn_module   modules/mod_authz_svn.so

5、配置SVN

    vi /opt/apache/conf/httpd.conf

     配置:

    <Location /svn>

       DAV svn

        SVNParentPath /data/svn/repos //svn父目錄

        AuthType Basic //連接配接類型設定

        AuthName "Subversion repository" //連接配接框提示

        AuthUserFile /data/svn/passwd //使用者配置檔案

        AuthzSVNAccessFile /data/svn/auth

        Require valid-user //passwd所有的使用者都可以通路  </Location>

6、建立SVN存儲倉庫

     #mkdir -p /opt/svndata/repos

    #svnadmin create &endash;fs-type fsfs /opt/svndata/repos

備份以前的SVN庫

#svnadmin dump /opt/svndata/repos > /root/repos20080328

把備份出來的資料恢複到本地

#svnadmin load /opt/svndata/repos/ < /root/repos20080328

7、建立本地通路控制檔案#/opt/apache/bin/htpasswd [-c] /opt/passwd north

//第一次設定使用者時使用-c表示建立一個使用者檔案。#/opt/apache/bin/htpasswd passwd 使用者名(加入新的使用者)

8、建立本地項目控制檔案

    touch /opt/svndata/auth

    檔案内容為:

[groups]

[repos1:/]

#wxy = rw

north = rw

tom = rw

[repos2:/]

repos2 = rw

9、安裝用戶端,通路伺服器

   [url]http://192.168.0.180:/svn/jishu[/url]

   注意:SVN是APACHE配置的時候加上去的。

10、到此安裝基本結束

     修改一下/data/svn/repos屬性,否則會導緻檔案上傳失敗。

     chmod -R apache.apache repos

三、日常維護指令和參數

linux下啟動svn

啟動svn

1、指定端口

啟動svn服務svnserve -d --listen-port 20000 -r /opt/svndata

 2、不指定端口

[[email protected] conf]# svnserve -d -r /var/svnroot

建立版本庫svnadmin create fs-type fsfs /opt/svndata/mark

檢視版本庫的資訊svn list  file:///opt/svndata/marksvn list --verbose file:///opt/svndata/mark

導入庫的目錄結構svn import /tmp/mark/ file:///opt/svndata/mark/ --message "init" (檔案夾mark下有bo)

删除版本庫mark下檔案夾bosvn delete svn://192.168.0.180:20000/opt/svndata/mark/bo -m "delete "

//導出$svnlook youngest oldrepo$svnadmin dump oldrepo >; dumpfile

//還原$svnadmin load newrepo < dumpfile

停止subversion服務

ps &endash;aux | grep svnserve

殺掉程序

kill -9 ID号

========================可以把svn加為系統服務===================================================================================

建立 autoRunSVN.bat檔案,内容是: sc create MySVNServer binpath= "/"C:/Program FilesSubversion/svnserve/svnserve/" --service -r H:/homerepos" displayname= "SVNService" depend= Tcpip start= auto pause

  留心之處:

  (1)sc是windows自帶的服務配置程式,MySVNServer 是服務的名稱,似乎沒什麼用。

  (2)參數binPath示意 svnserve可執行檔案的安裝路徑,由于路徑中的"Program Files"帶有空格,是以整個路徑須要用雙引号惹起來。而雙引号本身是個特殊字元,須要執行 轉移,是以在路徑前後的兩個雙引号都須要寫成/" 。

  (3)--service參數示意以windows服務的形式運作,--r指明svn repository的位置,service參數與r參數都作為binPath的一部分,是以與svnserve.exe的路徑一起被包含在一對雙引号當中,而這對雙引号不須要執行 轉義。

  (4)displayname示意在windows服務清單中顯示的名字, depend =Tcpip 示意 svnserve服務的運作須要 tcpip服務,start=auto示意開機後自動運作。安裝服務後,svnserve要等下次開機時才會自動運作。

  (5)binPath的等号前面無空格,等号後面有空格 displayname depend start也都一樣 service前面是--,不是- ,而r前面是-

  (6)若要解除安裝svn服務,則執行 sc delete svnserve 即可。

  (7)從”r;sc”到”r;auto”是在同一個指令sc,必須寫在同一行。 建立成功後,能夠在運作中鍵入service.msc察看系統服務,找到SVNService項,檢視這項服務的屬性,能夠運用 Windows提供的界面操作SVNService服務了。

  也能夠運用指令行啟動、停止服務。

  •   啟動服務: C:/>net start svnservice  服務正在啟動 . SVNService 服務已經啟動成功。 最後面的是服務名
  •   停止服務: C:/>net stop svnservice  服務正在停止. SVNService 服務已成功停止。

  删除建立的服務 C:/>sc delete svn svnservice

===========================配置apache通過http通路svn===========================================================================

 1. 引言

2. 安裝過程

2.1. 安裝Apache

2.2. 安裝Subversion

2.3. 配置

2.4. 使用SSL來保護你的伺服器

摘要

本文是TortoiseSVN1.3.5幫助中關于配置伺服器一節的翻譯,根據行文需要做了一些調整與增減。英文原文參見TortoiseSVN1.3.5幫助的3.1. Apache Based Server。

要使用TortoiseSVN(或者其它的Subversion用戶端),你要有一個存放版本庫的地方。你可以将版本庫存放在本機,使用file://協定來通路,也可以将它們放在一個

伺服器上,使用http://或svn://協定來通路。兩種伺服器協定(http://和svn://)也可以被加密成https://及svn+ssh://。下面将一步一步地為你展示如何在windows上配置

這樣一個伺服器。

如果你沒有伺服器或者你隻想單獨地工作,那麼将版本庫存放在本機并使用file://協定來通路是你最好的選擇,這樣的話,你可以略過本文。

注:目前windows下的subversion有專門的for apache2.2.x版本,可以跟Apache2.2.x配合,不過本文所帶的附件隻在Apache2.0.x上測試過

1. 引言

在所有的Subversion伺服器配置方式中,基于Apache的是最靈活的。雖然配置起來有一點點複雜,但是它提供了其它方式所沒有的好處:

WebDAV

基于Apache配置的Subversion伺服器使用了被許多其它程式支援的WebDAV協定。舉個例子,你可以在Windows的資料總管中将這樣的一個版本庫挂載成一個

”r;Webfolder”,然後像檔案系統中的其它檔案夾一樣通路它。

浏覽版本庫

你可以在不安裝Subversion用戶端的情況下,使用浏覽器來浏覽版本庫中的内容。這将使得更大範圍的使用者可以通路你的資料。

使用者驗證

你可以使用任何Apache支援的驗證機制,包括SSPI和LDAP。

安全

Apache是非常的穩定和安全,是以你的版本庫自然而然地擁有同樣的安全性。包括SSL加密。

2. 安裝過程

2.1. 安裝Apache

安裝Apache前,你要有一台運作Windows2000、Windows XP + sp1或Windows2003的電腦。

警告:請注意,沒安裝Service Pack 1的Windows XP将導緻錯誤的網絡資料進而破壞你的版本庫!

從http://httpd.apache.org/download.cgi最新版本的Apache Web伺服器。確定你下載下傳的版本大于2.0.54。2.0.54版本的Apache将不能與Subversion 1.3.xx配合工作。而且,小于2.0.54的Apache也因為在windows上的編譯存在一個bug而導緻不能與subversion1.2配合使用。

一旦你已經有了Apache2的安裝程式,你可以輕按兩下它,它将引導你完成整個安裝過程。請確定你輸入正确的伺服器URL(如果你的伺服器沒有DNS名稱,你可以直接輸入IP位址)。我建議你将Apache安裝成 for all Users,on Port 80,as a service。注意:如果你已經有一個IIS或者其它的程式使用80端口,安裝可能會失敗。如果是這樣,你可以到程式目錄下的Apache Group/Apache2/conf目錄中找到檔案httpd.conf,将其中的Listen 80改成一個不用的端口,比如Listen 81。然後重新運作這個安裝程式,這次應該不會再有問題了。

現在你可以在你的浏覽器中鍵入http://loccalhost,如果呈現了一個已經配置好的網站,那麼你的Apache就安裝成功了。

警告:

如果你将Apache安裝成一個服務,它将以本地system帳戶來運作。為Apache建立一個單獨的使用者來運作它将會更安全一些。

請確定運作Apache的使用者有版本庫的完全通路權限(右鍵版本庫目錄->屬性->安全)。要不然,使用者将無法送出他們的更改。

就算Apache以本機system來運作,你也要設定它能完全讀寫版本庫目錄。

如果沒有為Apache配置這個許可,使用者将會得到"禁止通路"的錯誤資訊,在Apache的錯誤日志中表現為錯誤500。

注意:

  • 安裝的不是apache_tomcat,是apache。因為前者不全,缺少一些子產品和配置檔案。
  • 如果機器上配置了iis或tomcat,一定要先停止或修改掉80端口,否則會因沖突而無法啟動。

2.2. 安裝Subversion

從http://subversion.tigris.org/ser ... entList?folderID=91(英文)

http://bbs.iusesvn.com/forum-7-1.html(中文)下載下傳最新版本的Subversion。

運作Subversion安裝程式,如果安裝程式能夠識别你已經安裝了Apache,那麼你的安裝基本上就OK了。如果它不能,那麼你要做一些額外的步驟。

注:如果你先安裝Apache,再安裝Subversion,正常情況下下面的工作(2.3配置前)Subversion安裝程式已經幫你完成了

使用資料總管,

  • 進入Subversion的安裝目錄(通常為c:/program files/Subversion),
  • 找到檔案httpd/mod_dav_svn.so和mod_authz_svn.so,将它們拷貝到Apache的modules目錄(通常為c:/program files/apache group/apache2/modules)。
  • 從Subversion的安裝目錄拷貝檔案libdb43.dll到Apache的modules目錄。
  • 使用如記事本之類的文本編輯器編輯Apache的配置檔案(通常為c:/program files/apache group/apache2/conf/httd.conf),修改以下内容:

去掉以下行的注釋(将開頭的#删除):

#LoadModule dav_fs_module modules/mod_dav_fs.so

#LoadModule dav_module modules/mod_dav.so

在LoadModule節的最後添加以下兩行:

LoadModule dav_svn_module modules/mod_dav_svn.so

LoadModule authz_svn_module modules/mod_authz_svn.so

2.3. 配置

現在,你已經安裝了Apache和Subversion,但是Apache還不知道如果處理像TortoiseSVN一樣的Subversion用戶端。要讓Apache知道哪個URL将被Subversion使用,

你要像下面這樣

編輯Apache的配置檔案(通常在c:/program files/apache group/apache2/conf/httpd.conf):

在配置檔案的最後添加下面這些行:

<Location /svn> 域名後的通路路徑

DAV svn

SVNParentPath "E:/svnroot"   是庫的上一級目錄,比如庫在E:/svnroot/java-source,那麼父目錄就是"E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"  用Apache2.2/bin/htpasswd -c passwd 使用者名生成的認證檔案,密碼經md5加密

AuthzSVNAccessFile "E:/svnroot/java-source/conf/authz"  通路權限使用svn的權限檔案,在調試階段可注釋掉

#AuthzSVNAccessFile "E:/svnroot/dotnet-source/conf/authz"

#AuthzSVNAccessFile "E:/svnroot/vc-source/conf/authz"             我試過了,像這樣配置多個權限檔案是不可以的,同一時間隻能有一個

Require valid-user    通路權限啟用,在調試階段可注釋掉

#Satisfy Any              調試階段使用這句代替上面一行

</Location>

如果是多個庫就一定要有多個location,如下

<Location /svn1>

DAV svn

SVNParentPath "E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"

AuthzSVNAccessFile "E:/svnroot/java-source/conf/authz"

Require valid-user

</Location>

<Location /svn2>

DAV svn

SVNParentPath "E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"

AuthzSVNAccessFile "E:/svnroot/dotnet-source/conf/authz"

Require valid-user

</Location>

<Location /svn3>

DAV svn

SVNParentPath "E:/svnroot"

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile "C:/Program Files/Apache Software Foundation/Apache2.2/bin/passwd"

AuthzSVNAccessFile "E:/svnroot/vc-source/conf/authz"

Require valid-user

</Location>

可以看到,如果多個庫,那麼需要不同的上下文,使用相同的上下文的話隻有最後一個起作用。

權限檔案和密碼檔案可以指向不同的或者是同一個。

注意:

所有參數一定要加雙引号,否則會報錯。

  • AuthUserFile : Apache2.2/bin/htpasswd -c passwd songyc      會提示輸入兩次密碼

檢視passwd内容:

songyc:$apr1$GsZgx4UC$QDf1cgNn2E3ZoJJDVeQMe.

  • AuthzSVNAccessFile:E:/svnroot/java-source/conf/authz

檢視authz内容:

[aliases]

# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

[groups]

admin_group=admin,tangzhigang,songyc

java_group=admin,wangyc,zhaoyue,yanjian,songyc

dot_group=admin,wangyou,luochunlin,liufujian,wangyongkui,songyc

others_group=admin,zhanghuan,caiyujie,suping,zhoujianfeng,test,songyc

[java-source:/]

@java_group = rw

* = r

# [/foo/bar]

# harry = rw

# &joe = r

# * =

# [repository:/baz/fuz]

# @harry_and_sally = rw

# * = r

這樣配置表示:你所有的版本庫将位于D:/SVN目錄下,要通路你的版本庫可以使用這樣的URL:http://MyServer/svn/,通路權限将由passwd檔案中的使用者名/密碼來限制。

要建立passwd檔案,可以打開指令行(DOS視窗),将目前目錄切換到apache2目錄(通常為c:/program files/apache group/apache2),然後打入以下指令以建立檔案:

bin/htpasswd -c passwd <username>

此指令執行bin目錄下的htpasswd.exe來建立一個密碼檔案,重新開機Apache服務。

将你的浏覽器指向http://MyServer/svn/MyNewRepository(MyNewRepository是你之前建立的Subversion版本庫)。如果一切正常,你将被提示輸入使用者名密碼,輸入正确的使用者名密碼後你就可以看到版本庫中的内容了。

對你剛剛輸入的apache配置作一些簡短的說明:

<Location /svn>

意味着可以通過像這樣的URL(http://MyServer/svn)來通路Subversion版本庫

DAV svn

告訴Apache哪個子產品負責服務像那樣的URL--在這裡就是Subversion子產品

SVNListParentPath on

在Subversion 1.3及更高版本中,這個訓示器使得Subversion列出由SVNParentPath指定的目錄下所有的版本庫

SVNParentPath D:/SVN

告訴Subversion在目錄D:/SVN下尋找版本庫

AuthType Basic

啟用基本的驗證,比如使用者名/密碼對

AuthName "Subversion repositories"

當一個驗證對話框彈出時,告訴使用者這個驗證是用來做什麼的

AuthUserFile D:/passwd

指定D:/passwd用為密碼檔案用來驗證使用者的使用者名及密碼

AuthzSVNAccessFile D:/svnaccessfile

指定D:/svnaccessfile來限定各個使用者或組在版本庫中目錄的通路權限

Require valid-user

限定使用者隻有輸入正确的使用者名及密碼後才能通路這個路徑

上面的配置僅僅是一個簡單的示例。你還可以對Apache進行許許多多的配置。

1如果你想讓所有使用者對版本庫都有讀的權限而隻有特定的使用者才有寫的權限,你可以将這行

Require valid-user

改為

 <LimitExcept GET PROPFIND OPTIONS REPORT>

Require valid-user

</LimitExcept>

2上面的配置使用了passwd檔案将你所有的版本庫作為一個單元來限定通路權限。如果你想獲得更多的控制,如限定某個使用者可以通路版本庫中的哪個目錄,可以把下面這行的#去掉:

#AuthzSVNAccessFile D:/svnaccessfile

然後用文本編輯器建立一個Subversion授權檔案。Apache将確定隻有有效的使用者可以通路你的/svn位置,然後将使用者名傳到AuthzSVNAccessFile子產品,這樣可以依據Subversion授權

檔案得到更精細的權限控制。注意,路徑将被指定為[庫:路徑]或者簡單的[路徑]。如果你不明确指定一個庫,通路規則将應用到由SVNParentPath指定的目錄下所有的版本庫中。一個

授權檔案例子可能像這樣:

[groups]

admin = john, kate

devteam1 = john, rachel, sally

devteam2 = kate, peter, mark

docs = bob, jane, mike

training = zak

# 為所有庫指定預設通路規則

# 所有人可以讀,管理者可以寫,危險分子沒有任何權限

[/]

* = r

@admin = rw

dangerman =

# 允許開發人員可以完全通路他們的項目版本庫

[proj1:/]

@devteam1 = rw

[proj2:/]

@devteam2 = rw

[bigproj:/]

@devteam1 = rw

@devteam2 = rw

trevor = rw

# 文檔編寫人員對所有的docs目錄有寫權限

[/trunk/doc]

@docs = rw

# 教育訓練人員可以完全通路教育訓練版本庫

[TrainingRepos:/]

@training = rw

2.4. 使用SSL來保護你的伺服器

以上的工作已經可以讓你的svn伺服器正常工作了。

如果你要更安全一些,可以配置ssl來保護你的伺服器。

因為美國出口限制,預設安裝的Apache伺服器不支援SSL。但是你自己可以很容易地在其它地方下載下傳到所需要的子產品,然後安裝它。

首先你需要SSL的必需檔案。你可以http://hunter.campbus.com/或這裡找到相應的軟體包

然後隻要将包解開将其中的mod_ssl.so拷到Apache的modules目錄、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目錄、conf/ssl.conf拷到conf目錄。

在Apache的conf目錄中用文本編輯器打開ssl.conf。

将下面這些行用#注釋掉:

然後隻要将包解開将其中的mod_ssl.so拷到Apache的modules目錄、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目錄、conf/ssl.conf拷到conf目錄。

在Apache的conf目錄中用文本編輯器打開ssl.conf。

将下面這些行用#注釋掉:

修改 SSLCertificateFile conf/ssl.crt/server.crt

為 SSLCertificateFile conf/ssl/my-server.cert

修改 SSLCertificateKeyFile conf/ssl.key/server.key

為 SSLCertificateKeyFile conf/ssl/my-server.key

修改 SSLMutex file:logs/ssl_mutex

為 SSLMutex default

删除以下兩行(如果有): <IfDefine SSL>

</IfDefine>

打開Apache配置檔案(httpd.conf),去掉這行的注釋 #LoadModule ssl_module modules/mod_ssl.so

Openssl需要一個配置檔案。你可以從這裡下載下傳一個可工作的版本Openssl需要一個配置檔案。你可以從這裡下載下傳一個可工作的版本http://tud.at/programm/openssl.cnf

将它儲存到bin/openssl.cnf。

下面你要建立一個SSL證書。你可以打開一個指令行視窗,然後cd到Apache安裝目錄(比如C:/program files/apache group/apache2),敲入以下指令: bin/openssl req -config bin/openssl.cnf -new -out my-server.csr

你将被問及一句密碼短語。請注意,不要使用簡單的幾個詞,而應該輸入一整個句子,比如一篇詩詞的一部份,越長越好。同樣,你還要輸入你的伺服器URL。然後

其它的問題都是可選問答的,不過我建議你也将它們填充。

下一步,敲入以下指令: bin/openssl rsa -in privkey.pem -out my-server.key

以及(注意,隻有一行) bin/openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000

這樣将建立一個4000天後才過期的證書。最後敲入: bin/openssl x509 -in my-server.cert -out my-server.der.crt -outform DER

這些指令在Apache目錄下建立了一些檔案(my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert)。将這些檔案拷貝到目錄conf/ssl

(比如C:/program files/apache group/apache2/conf/ssl),如果目錄ssl不存在,你必須先建立一個。

重新開機Apache服務。

現在可以用類似這樣的url來通路你的版本庫了https://servername/svn/project

強制通過SSL來通路

當你配置了SSL來提高版本庫安全時,你可能想禁用無SSL的http通路方式,而隻允許通過https通路。要達到這種效果,你要在<Location>塊加入另外一個訓示器SSLRequireSSL。

一個示例<Location>塊可能像這樣:

<Location /svn>

DAV svn

SVNParentPath D:/SVN

SSLRequireSSL

AuthType Basic

AuthName "Subversion repositories"

AuthUserFile passwd

#AuthzSVNAccessFile svnaccessfile

Require valid-user

</Location>

注意:

如果遇到apache無法啟動的情況,可以用/$apache_home/bin/httpd -t 檢查httpd.conf是否存在文法錯誤

如果遇到浏覽器通路報forbidden,提示無通路權限時,需檢查”r;SVNParentPath”,看是否指向的是庫的上一級目錄

1、建立庫

E:/svnroot>svnadmin create java-source-bak

2、建立鈎子腳本

E:/svnroot/java-source-bak/hooks>svnsync init file:///e:/svnroot/java-source-bak  http://10.150.132.140/svn1/java-source

svnsync: 此版本庫不允許修改版本屬性;請管理者建立 pre-revprop-change 鈎子

新的版本庫中找到hooks檔案夾,在裡頭建立pre-revprop-change.bat鈎子腳本

       如:e:/svnroot/hooks/pre-revprop-change.bat

如果不建這個空的pre-revprop-change.bat會報"svnsync:此版庫不允許修改版本屬性;請管理者建立pre-revprop-change鈎子!

3、初始化

E:/svnroot/java-source-bak/hooks>svnsync init file:///e:/svnroot/java-source-bak

 http://10.150.132.140/svn1/java-source

認證領域: <http://10.150.132.140:80> Subversion repositories

”r;server”的密碼: *****                            這是系統使用者的密碼

認證領域: <http://10.150.132.140:80> Subversion repositories

使用者名: songyc                                     版本庫的使用者

”r;songyc”的密碼: *****                           版本庫使用者的密碼

複制版本 0 的屬性。

運作成功則會提示:複制版本 0 的屬性

4、執行同步

E:/svnroot/java-source-bak/hooks>svnsync sync file:///e:/svnroot/java-source-bak

認證領域: <http://10.150.132.140:80> Subversion repositories

”r;server”的密碼: *****

認證領域: <http://10.150.132.140:80> Subversion repositories

使用者名: songyc

”r;songyc”的密碼: *****

傳輸檔案資料.

已送出版本 1。

複制版本 1 的屬性。

已送出版本 2。

複制版本 2 的屬性。

傳輸檔案資料.....................

這樣我已經成功使用svnsync同步庫了。

  • 如果linux則用crontab建立自動同步的任務
  • 如果是windows,則可建立一個bat 然後建一個任務計劃

5、定時任務:

添加到任務計劃裡

開始-->程式-->附件-->系統工具-->任務計劃,設定為系統啟動時運作

svn 指令行

取版本庫項目(最新)

1、先清空目錄

E:/test_svn_oper>rmdir /s /q data_mapping

2、取出工程

E:/test_svn_oper>svn checkout --username songyc --password ehong svn://10.150.132.140/java-source/data_mapping

給程式修訂版打标記(基線)

通常版本控制軟體都有實作打基線的功能。

而SVN又是如何來打基線呢,

其實SVN天生就可以根據一個修訂版本号檢出一個特定的修訂版本,隻不過如果你不嫌麻煩你可以用一個excel記錄一下你目前釋出程式時其主目錄對應的修訂号。

這樣在需要的時候可以根據這個修訂号把當時的文檔檢出來。

但是通常在SVN上打基線還是通過”r;分支/标記”功能來實作的,在ecplise中的實作方式如下:

1。點選"window->Open Perspective",選擇"SVN資源庫研究"。

2。在界面左邊部分的”r;SVN資源庫”中選擇要打基線的項目的根目錄,右擊滑鼠,在彈出的菜單中選擇”r;分支/标記”。

3。在”r;到URL”中填寫你要把其基線打在什麼目錄,一般要改成其它目錄,然後點選确定即可。

這樣操作後其實是産生了一個分支,這個過程并不耗費SVN伺服器的存儲空間,因為其隻是類似于實體連結的方式建立了了個對應于目前修訂版本的鍊結,是以我們

可以每發一個版本就打一次基線而不用擔心SVN空間被耗光。

在下次需要用到該基線的時候隻要把SVN中我們在上面第三步中填寫在”r;到URL”目錄檢出即可。

但是基線是不能修改的,展現在SVN中就是你從基線目錄中檢出的檔案如果做了修改,再送出就變成了一個于原先項目不同的分支版本。

修改個别檔案也要起一個新的目錄(新的基線)麼?

按标記(基線)取某一程式

1、擷取svn項目

1.1 取版本庫最新的

C:/Documents and Settings/server>svn checkout --username songyc --password ehong svn://10.150.132.140/java-source/data_mapping songyc ehong

A    ehong/java-source/ehongWebservice

A    ehong/java-source/ehongWebservice/.classpath

A    ehong/java-source/ehongWebservice/webapps

A    ehong/java-source/ehongWebservice/webapps/META-INF

A    ehong/java-source/ehongWebservice/webapps/META-INF/MANIFEST.MF

A    ehong/java-source/ehongWebservice/webapps/SOAPMonitorApplet.java

A    ehong/java-source/ehongWebservice/webapps/happyaxis.jsp

注意svn checkout 的一些參數

--revision (-r) REV,

--quiet (-q),

--non-recursive (-N),

--username USER,

--password PASS,

--no-auth-cache,

--non-interactive,

--config-dir DIR

1.2 按修訂版取

 svn checkout -r   修訂版字元串  --username songyc --password ehong svn://10.150.132.140/java-source songyc ehong

2、添加目錄或檔案

将工作副本中的檔案/目錄添加到存儲庫中:svn add

在您第一次在工作目錄中建立并編輯新檔案後,可以将此檔案添加到存儲庫中,或添加一個目錄,目錄中有無内容均可。

svn add FILENAME/DIR

這樣就會在您的工作副本中添加檔案/目錄,并安排它們以添加到存儲庫中。您下次送出時,會上載這些檔案/目錄,并将它們添加到存儲庫中。

如果您添加了内容,但在送出前又改變了主意,則可以使用 svn revert 取消添加内容的安排。

轉換:--targets FILENAME, --non-recursive (-N), --quiet (-q), --config-dir arg, --auto-props, --no-auto-props

請參見添加檔案/目錄示 例。

檢視帶有修訂和作者資訊的特定檔案的内容:svn blame

若要線上檢視指定檔案的作者和修訂資訊,請鍵入:

svn blame FILENAME

每行文本的開始處都以上次更改該行的作者(使用者名)和修訂版本号作為批注。

轉換:--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

檢視特定檔案的内容:svn cat

有時,與存儲庫相比較,您的工作副本可能已過時;或者您可能已修改了本地工作副本。在這些情況下,在送出更改或決定編輯您的工作副本之前,您會 希望檢視指定檔案的内容差異。運作 svn cat FILENAME 将自動從存儲庫中取出 HEAD 修訂版本。這條子指令主要用于檢索具有較舊修訂版本号的檔案,并将其顯示在螢幕上。通過在此站點上浏覽項目源代碼,也可以執行相同的操作。

轉 換:--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

$svn add(添加一個目錄或檔案。用法:先建一個檔案或目錄,取名字為foo 然後

  執行這個指令$svn add foo <foo為檔案或目錄>)

3、清理工作副本

名稱

svn cleanup &emdash; 遞歸清理工作拷貝。

概要

svn cleanup [PATH...][/pre]描述

遞歸清理工作拷貝,删除未完成的工作拷貝鎖定,并恢複未完成的操作。如果你得到一個”r;工作拷貝已鎖定”的錯誤,運作這個指令可以删除無效的鎖定,讓你的工作拷貝再次回到可用的狀态。

如果,因為一些原因,運作外置的差別程式(例如,使用者輸入或是網絡錯誤)有時候會導緻一個svn update失敗,使用--diff3-cmd選項可以完全清除你的外置差別程式所作的合并,你也可以使用--config-dir指定任何配置目錄,但是你應該不會經常使用這些選項。

别名

改變

工作拷貝2

是否通路版本庫

選項

--diff3-cmd CMD

--config-dir DIR

[/pre]例子

svn cleanup沒有輸出,沒有太多的例子,如果你沒有傳遞PATH,會使用”r;.”。

$ svn cleanup

4、複制工作副本或存儲庫中的檔案或目錄

複制工作副本或存儲庫中的檔案或目錄:svn copy

在項目中,您可能需要用到過去的舊文檔。例如,您可能想要使用一個已存在的 HTML 檔案,使用其代碼作為參考以在建立新内容時保持産品外觀和感覺。建立檔案時,您無需從頭開始,隻需使用 svn copy 複制此檔案,然後将其另存為其它名稱并更改其内容。您可以從存儲庫将檔案複制為本地工作副本,也可以将本地工作副本複制回存儲庫檔案。您還可以在本地工作 副本内部複制檔案。Subversion 不支援在存儲庫之間進行複制。可使用 svn copy SRC DST 完成此操作。

轉換:--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR

請參見 svn copy。

$svn copy (複制。用法:$svn copy foo.c index.c)

 5、 從本地工作副本中删除檔案或目錄,當送出時,才會在存儲庫中将該檔案實際删除

從本地工作副本中删除檔案或目錄:svn delete

您可能希望從本地工作副本中删除不需要的檔案。使用 svn delete FILENAME 可安排删除檔案。僅當您送出時,才會在存儲庫中将該檔案實際删除。

轉換:--force, --force-log, --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --targets FILENAME, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR

$svn delete(删除一個目錄或檔案。

用法:$svn delete foo   <foo為檔案或目錄>)

6、檢視檔案之間的差異

檢視檔案之間的差異:svn diff

可以使用 svn diff 顯示工作副本中的指定檔案相對于存儲庫中相應檔案所做的本地修改。在指令提示符處,請鍵入:

svn diff (檔案的路徑) (項目存儲庫的 URL)

例如,若要将本地修改後的檔案”r;index.html”與項目存儲庫中的相應檔案進行比較,請鍵入:

svn diff $SRC/...../index.html https://(項目名稱).(域)/svn/(項目名稱)/trunk (項目名稱) --username [在此處輸入使用者名]

除此之外,您也可以轉到該檔案所屬的目錄,并鍵入:

svn diff (FILENAME)

該指令将顯示差異,并且帶有修訂版本号。

轉換:--revision (-r) REV, --old OLD-TARGET, --new NEW-TARGET, --extensions (-x) "ARGS", --non-recursive (-N), --diff-cmd CMD, --notice-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --no-diff-deleted, --config-dir DIR

請參見檢查曆史、svn diff。

7、在本地計算機上導出空目錄樹

在本地計算機上導出空目錄樹:svn export

在您的本地計算機上,可以從項目存儲庫或本地工作副本内部提取一個無版本的副本,也稱為空目錄樹。若要從存儲庫中獲得較舊修訂版本的空目錄,請 鍵入:

svn export [-r REV] [PATH]

該指令将從 URL 指定的存儲庫中的修訂版本 REV 位置(如果指定,否則從 HEAD 位置)将空目錄樹導出到 PATH。如省略 PATH,則該 URL 的最後一部分将用作本地目錄名稱。除此之外,您也可以在本地計算機内部,從一個工作副本(由 PATH1 指定)向另一工作副本(由 PATH2 指定)導出空目錄樹。這将保留所有的本地更改,但不會複制版本控制中的檔案。若要執行此操作,請鍵入:

svn export PATH1 PATH2

轉換:--revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

擷取有關 Subversion 的幫助:svn help

Subversion 可以在指令行界面為您提供幫助。

8、若要獲得有關特定子指令的幫助,

svn help [SUBCOMMAND...]

轉換:--version, --quiet (-q)

将您的更改提供給 SVN 存儲庫

對檔案和/或目錄進行本地更改後,您必須向 SVN 存儲庫送出這些更改。

9、送出更改

若要向共享存儲庫送出您的更改,請鍵入:

svn commit

加備注送出

svn commit -m "請在此處鍵入您的理由"

如果您不包括對該檔案更改的描述,系統将提示您調用檔案編輯器添加描述,然後 svn 才能完成送出操作;否則将會出現”r;送出失敗”錯誤。所有的送出都會被自動記錄,并釋出到項目的送出讨論中。

轉換:--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --targets FILENAME, --force-log, --username USER, --password PASS, --no-auth-cache, --non-interactive, --encoding ENC, --config-dir DIR

請參見提 交您的更改、editor-cmd。

10、将無版本的檔案或樹導入到項目存儲庫中

svn import

您可以使用 svn import 将無版本的檔案或樹遞歸送出到項目存儲庫中。将根據需要在存儲庫中建立父目錄。使用下面的指令可以從 PATH 向 URL 遞歸送出副本。如果省略 PATH,将認為其為”r;.”。

svn import [PATH] URL

示例:若要在您的本地計算機上建立帶有一個檔案的無版本目錄 (D)。請點選項目左側導航窗格中的”r;Subversion”鍊 接,找到 Subversion 頁面。請注意,”r;浏覽源代碼”下未列出 NEWDIR。若要将 D 導入項目存儲庫,請鍵入:

svn import -m "請在此處鍵入您的資訊" D http://(項目名稱).(域)/svn/(項目名稱)/NEWDIR

重新整理該頁面。請注意,此時”r;浏覽源代碼”下列出了 D。點選 D 檢視該檔案。

轉換:--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR, --auto-props, --no-auto-props

11、列印有關工作副本中檔案的具體資訊

svn info

有時,您将需要有關工作副本中檔案的具體資訊,以執行某些子指令。鍵入 svn info,将列印出詳盡且有用的信 息,這些資訊涉及工作副本中的工作副本路徑中的項,其中包括:路徑、名稱、URL、修訂版本、節點類型、上次更改、作者、上次更改修訂版本、上次更改日 期、上次更新的文本、上次更新的屬性以及校驗和。

轉換:--targets FILENAME, --recursive (-R), --config-dir DIR

12、儲庫中的目錄項清單

svn list

在開始處理項目或取出”r;工作副本”之前,您可能希望檢視項目存儲庫中的内容(即目錄和檔案),或檢視本地工作副本中的目錄項。在指令提示符處鍵 入 svn list [TARGET...],也可以檢視這些内容。除此之外,您也可以找到項目中的”r;軟體 配置管理”頁,檢視項目存儲庫。

轉換:--revision (-r) REV, --verbose (-v), --recursive (-R), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

13、檢視送出日志資訊

svn log

如果要檢視”r;工作副本”或存儲庫中檔案/目錄的各個檔案/目錄曆史,以跟蹤修訂資訊,請鍵入:

svn log [PATH]

該指令會顯示出檔案/目錄的修訂資訊,從最近所做的修訂版本開始顯示送出資訊和作者姓名等資訊。除此之外,您也可以使用該站點,檢視項目存儲庫 中各個檔案的送出日志資訊。請點選項目左側導航窗格中的”r;Subversion”連結。将出現 Subversion 頁。搜尋”r;浏覽源代碼”的目錄中的檔案,然後點選檔案名。這時将會顯示一個送出日志資訊頁面。

轉 換:--revision (-r) REV, --quiet (-q), --verbose (-v), --targets FILENAME, --stop-on-copy, --incremental, --xml, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

請參見 svn log。

14、合并更改

svn merge

您可以運作 svn merge 指令,以訓示 Subversion 将存儲庫中最新版本的檔案合并到您的工作副本中。

轉換:--revision (-r) REV, --non-recursive (-N), --quiet (-q), --force, --dry-run, --diff3-cmd CMD, --ignore-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

請參見 svn merge、解 決沖突(合并其他人的更改)、分支和合并:常見合并使用案例、合 并最佳實踐。

使用存儲庫

15、建立新目錄

svn mkdir

若要在您的工作副本中建立新目錄,請鍵入:

svn mkdir PATH

若要在您的項目存儲庫中建立新目錄,請鍵入:

svn mkdir URL

PATH 或 URL 的最後一部分決定目錄名稱。在立即送出時在存儲庫中建立目錄,是以還需要一條送出資訊

轉換:--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

16、移動檔案或目錄

svn move

您可以使用 svn move SRC DST 在工作副本或項目存儲庫内部移動檔案或目錄。此指令等效于在使用 svn copy 後,再使用 svn delete。在工作副本内部移動檔案或目錄,不僅會移動該檔案或目錄,而且 還将安排它以便于下次送出時進行添加。在項目存儲庫内部移動檔案或目錄屬于封閉單元式送出,是以需要一條送出資訊。

轉換:--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

使用屬性

Subversion 具有很多具體屬性,這些屬性影響或決定其行為。您可以修改、送出和撤消屬性更改,就像對檔案内容所執行的操作一樣。您還可以從本地工作副本或

項目存儲庫的 檔案、目錄或修訂版本中,删除、編輯、列印、列出以及設定屬性。

請參見 屬性、無 版本屬性、中繼資料屬性、svn propdel、svn propedit、svn propget、svn proplist、svn propset、Hook 腳本。

解決沖突:svn resolved

更新本地工作副本時,可能會遇到沖突。您需要解決此沖突。解決沖突後,鍵入 svn resolved PATH..., 通知工作副本該沖突已”r;解決”。

轉換:--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

請參見解 決沖突(合并其他人的更改)。

17、撤消您的更改

svn revert

使用 Subversion 時,您會發現 svn revert PATH... 等效于 Windows 中的 Ctrl Z。您可以:

撤消本地工作副本中的任何本地更改,進而解決沖突狀态。

撤消工作副本中的條目内容及屬性更改。

取消任何進度安排操作,如添加檔案、删除檔案等。

注意,如不提供目标,會導緻工作副本中的更改丢失。

轉換:--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

18、擷取檔案/目錄的狀态

svn status

在版本控制中,将更改送出到項目存儲庫之前最好對其進行審查。可以運作 svn status 列印工作副本中的檔案和目錄的狀态。列印結果為八列編碼輸出。由于每列都有詳盡的圖例,若要從此輸出中得出”r;無錯誤”的結論幾乎不可能。若要使此任務更加 簡單,并同時可看到示例,請在指令提示符處鍵入 svn help status。

轉換:--show-updates (-u), --verbose (-v), --non-recursive (-N), --quiet (-q), --no-ignore, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir

請參見檢 查你的更改。

轉換工作副本:svn switch

可以使用 svn switch URL [PATH] 更新工作副本,以鏡像新的 URL。您還可以将工作副本或部分工作副本移動到新的分支。您可以将此子指令用作分支的快捷方式。

轉換:--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --relocate, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

請參見轉換工作副 本、分支和合并以 及 svn switch。

更新工作副本:svn update

為了進行更好的版本控制,建議您每天用項目存儲庫更新本地工作副本,請使用:

svn update [PATH...]

列出的已更新條目以及它們的目前狀态顯示如下:

A = 已将一個檔案添加到您的工作副本中。

U = 已更新您的工作副本中的一個檔案。

D = 已從您的工作副本中删除一個檔案。

R = 已替換您的工作副本中的一個檔案。

G = 已成功合并了一個檔案。

C = 一個檔案已合并了必須手動解決的沖突

轉換:--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

請參見更 新你的工作副本、手 動合并沖突。

分支和标記

項目的主幹通常用作開發主線,而分支通常用作主線的變更。分支是正在進行的開發線。在軟體開發生命周期中,如果軟體産品的釋出版本已到期,經常 會用到分支,使測試者可以使用候選版本,使新的開發可以繼續進行,不受測試的限制。分支還用于實驗性工作,以及完成代碼重寫。标記是将一組檔案修訂版本标 記為整體的方式。雖然分支和标記都是使用 svn copy 子指令建立的,但它們是完全不同的。分支表示多個修訂版本而标記隻表示單個修訂版本。

本站點上您項目的 Subversion 存儲庫支援對您的源檔案進行分支和标記。對于 Subversion 來說,标記和分支屬于簡單實用的”r;複制”操作。

若要建立分支或标記項目檔案,請鍵入:

svn copy SRC DST -m "在此處鍵入您的資訊"

常見問題

所有用戶端:

1, 為什麼用戶端無法送出,報告需要"clean up"的錯誤。

Subversion用戶端在送出内容之前會在本地的工作拷貝寫日志,防止其他用戶端再次作操作,如果這個送出過程中發生錯誤,就會存在未清理的日志,解決這個問題隻需要運作清理指令。

如果是使用svn指令行用戶端,隻需要在待清理的目錄或其父目錄執行"svn cleanup",如果是TortoiseSVN,隻需要在目錄或其父目錄執行"右鍵->TortoiseSVN->CleanUp"。

2,為什麼添加的檔案,别人看不到,版本庫裡也沒有?

最可能的原因是,你用svn add(如果是TortoiseSVN可能是”r;右鍵->TortoiseSVN->Add...”)添加某個檔案,隻是在本地注明某個檔案是預定要增加,而沒有實際添加到版本庫,要添加到版本庫必須執行svn commit(如果是TortoiseSVN可能是”r;右鍵->svn commit...”)。

同樣的,svn delete要實際發生效果也需要svn commit。

3. Subversion有共享功能嗎?

這是很多人問得問題,就是一份代碼能否影射到多個地方,在一個地方送出,另一個地方更新的時候也能看到。

我想Subversion隻是部分支援這個功能。一個方式是外部引用,具體看http://subversion.org.cn/svnbook/1.1/svn-ch-7-sect-3.html ,可以實作目錄的共享,不能用于檔案。

另一種方式是硬連結,工作拷貝必須是類UNIX系統下才能用,類似于UNIX的連結功能。

4. Subversion有VSS一樣的鎖定功能嗎?

答案是有,通過給需要鎖定的檔案增加svn:needs-lock鎖定即可,詳細内容見svnbook。

http://www.subversion.org.cn/svn ... .special.needs-lock

5.狀況是這樣的,已經修改到版本1284了,但是中間有個1113版本的送出導緻更新失敗,需要将1113的修改恢複過來,就是去掉1113版本做的所有修改,

但是保留1114以及以後的所有修改,重新做一次build,然後釋出。我用什麼方法,在取代碼的時候,把這個V1113屏蔽掉呢??

知道合并嗎,取消某個版本的操作就是反向合并,在你的工作拷貝執行下面的指令。

svn merge -c -1113

6.如果是撤消1113,1114,1115版本的話,是不是分别執行svn merge -c -1113,svn merge -c -1114,svn merge -c -1115呢?

svn merge -c 1113,1114,1115就可以

運作svn help merge,就會很清楚

整體思路:

先有版本庫

當有穩定的版本後建立标記庫,就是将版本庫檔案複制一份,這個标記庫是日後需要維護的基線庫。

之後的修改仍是在版本庫進行,測試時将所修改的版本與标記庫融合merge,如果測試失敗執行反向融合,這樣不會傷及基線庫

具體實作:

1、取項目

 svn checkout -r   修訂版字元串  --username songyc --password ehong svn://10.150.132.140/java-source songyc ehong

2、複制一份作為标記庫

改用分支實作

E:/test_svn_oper>svn cp svn://10.150.132.140/java-source/data_mapping/  svn://10.150.132.140/java-source/data_mapping/branches/ 20100806_shawn_test_branch &endash;m "create a branch"

svn: 不能在源中混合版本庫和工作副本

懷疑是因為版本庫中還沒有建立branches目錄,于是先建立

E:/test_svn_oper>svn mkdir svn://10.150.132.140/java-source/data_mapping/branches

svn: 無法使用外部編輯器獲得日志資訊;考慮設定環境變量 $SVN_EDITOR,或者使用 --message (-m) 或 --file (-F) 選項

svn: 沒有設定 SVN_EDITOR,VISUAL 或 EDITOR 環境變量,運作時的配置參數中也沒有 ”r;editor-cmd” 選項

E:/test_svn_oper>svn copy svn://10.150.132.140/java-source/data_mapping 20100806_shawn_test_branch -m "create a branch"

svn: 本地操作,非送出操作無須日志資訊或版本屬性

可以通過eclipse建立标記或分支,操作很簡便。

現在的問題是如何對branch進行版本融合?并取出

3、修改某兩個檔案并更新,送出

4、将新版本與标記庫中的檔案融合

5、反向融合其中一個檔案

6、取出标記庫檔案

7、執行ant腳本打包

E:/test_svn_oper/project_co/data_mapping>svn copy svn://10.150.132.140/java-source/Showcase/ svn://10.150.132.140/java-source/trunk  -m "create trunk"

送出後的版本為 788。

E:/svnroot>dir

 驅動器 E 中的卷是 work

 卷的序列号是 A876-7349

 E:/svnroot 的目錄

2010-08-03  09:51    <DIR>          .

2010-08-03  09:51    <DIR>          ..

2010-03-16  10:58    <DIR>          dotnet-source

2010-03-16  10:58    <DIR>          EhongDocument

2010-03-16  10:58    <DIR>          java-source

2010-08-03  09:04    <DIR>          java-source-bak

2010-03-16  10:58    <DIR>          private

2010-08-03  09:51                47 svn_sync.bat

2010-05-10  10:16    <DIR>          vc-source

               1 個檔案             47 位元組

               8 個目錄 16,272,773,120 可用位元組

E:/svnroot>cd java-source

E:/svnroot/java-source>svn update

跳過”r;.”

E:/svnroot/java-source>

svn add必須在本地副本中執行,否則就會報下面的錯誤

E:/svnroot/java-source>svn add -N branches svn://10.150.132.140/java-source/

svn: ”r;.”不是工作副本

svn: 不能打開檔案”r;.svn/entries”: 系統找不到指定的路徑。

E:/test_svn_oper/project_co/branches>svn list svn://10.150.132.140/java-source

CompressFrameWork/

Showcase/

branches/

data_mapping/

ehongWS/

ehongWebservice/

esiExample/

esiapidemo/

esiapigwt/

generator/

gwtframework/

java_persistent/

physician_guidance/

tags/

trunk/

E:/test_svn_oper/project_co/branches>svn status

?      my-showcase-branch

E:/test_svn_oper/project_co/branches>svn update

版本 789。

E:/test_svn_oper/project_co/branches>svn --help import

E:/test_svn_oper/project_co/branches>svn import -m "test" my-showcase-branch svn://10.150.132.140/java-source/branches

增加           my-showcase-branch/war/showcase/deferredjs/B5CFCA6C372D6E83BDA4774483936248/28.cache.js

增加           my-showcase-branch/war/showcase/deferredjs/B5CFCA6C372D6E83BDA4774483936248/38.cache.js

增加           my-showcase-branch/war/showcase/deferredjs/B5CFCA6C372D6E83BDA4774483936248/2.cache.js

增加 (二進制)  my-showcase-branch/war/showcase/EDC7827FEEA59EE44AD790B1C6430C45.cache.png

增加 (二進制)  my-showcase-branch/war/favicon.ico

增加           my-showcase-branch/README.txt

增加           my-showcase-branch/build.xml

送出後的版本為 790。

文法:

svn import -m "備注" 本地目錄 svn://遠端目錄/a/b/c

遠端庫下的目錄不用存在,會自動遞歸建立

--------------------------svn使用者和密碼緩存到用戶端的位置---------------------------------------------------

C:/Documents and Settings/Administrator/Application Data/Subversion/auth

删除auth下面的所有檔案夾,重新連接配接遠端伺服器,對話框終于出來了!

如果連接配接和checkout時提示伺服器積極拒絕最大的可能是:

啟動服務時使用的端口在用戶端無法通路。是以最好在啟動時不指定端口号。