导航:首页 > 净水问答 > rsync过滤svn

rsync过滤svn

发布时间:2022-09-19 04:23:22

1. linux怎么还原rsync备份的svn文件

问题可以说具体点的。。svn文件还原很容易,rsync备份是什么意思呢

2. 如何在阿里云服务器上部署SVN服务

阿里云搭建SVN服务器

1:安装svn

apt-get install subversion

2. 开启svn服务器

svnserve -d

检查是否开启:ps aux | grep svnserve

若出现如下内容:

wkr 6537 0.0 0.0 13784 956 ? Ss 16:18 0:00 svnserve -d
wkr 7593 0.0 0.0 5784 864 pts/0 S+ 21:57 0:00 grep –color=auto svnserve

表示服务已开启。(注意:一定要有第1行,只有第2行说明服务未启动)

停止svn服务: killall svnserve

3. 建立仓库

svnadmin create /home/svnrepos
理论上,仓库可以建立在任何目录中。

注意:重启svnserve 执行 svnserve -d -r /home

这样在eclipse客户端把工程导入svn的时候 url需要填写

svn://ip/svnrepos/project_name

如果启动的时候带如下参数:svnserve -d -r/home/svnrepos

客户端:svn://ip/project_name 这样子会报错。验证失败

4. 修改配置文件

编辑 svnserve.conf

vi /home/svnrepos/conf/svnserve.conf

把anon-access = read 改为 none,auth_access = write

password-db = passwd authz-db = authz的注释去掉,还有[general]的注释也要去掉(这个默认没有注释)。
注:当你去掉注释的时候,不要简单的把前面的#去掉,要把前面的空格一块去掉,不然在Eclipse中使用的时候会出现配置文件格式错误的问题。

注意:如果authz-db = authz 这个注释掉了,则不需要配置/home/svnrepos/conf/authz

5. 修改帐户文件

vi /home/svnrepos/conf/passwd

### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.

[users]
# harry = harryssecret
# sally = sallyssecret
user1 = pass1 # 输入你定义的用户名和密码,密码显然没有加密

6. 修改授权文件

gedit /home/svnrepos/conf/authz

修改或者输入下面2行:

[svnrepos:/] ##格式为 版本库名称 + :/
user1 = rw

其中,repos1是仓库名称,user1是用户名,rw代表读写。

7.客户端连接
svn co svn://ip/oplinux
用户名密码:rsync

8.实现SVN与WEB同步,可以CO一个出来,也可以直接配在仓库中

1)设置WEB服务器根目录为/alidata/www/webroot

2)checkout一份SVN

svn co svn://localhost/alidata/www/svndata/myproject /alidata/www/webroot

修改权限为WEB用户

chown -R www:www /alidata/www/webroot/myproject

3)建立同步脚本

cd /alidata/www/svndata/oplinux/hooks/

cp post-commit.tmpl post-commit

编辑post-commit,在文件最后添加以下内容

export LANG=en_US.UTF-8

SVN=/usr/bin/svn

WEB=/alidata/www/webroot/

$SVN update $WEB –username myname –password myname

chown -R www:www $WEB

增加脚本执行权限

chmod +x post-commit

这样,我们上传svn后,生产站点就能立马显示出来了,自动化程度高了很多。



3. linux上的rsync命令详解

rsync 就是远程同步的意思remote sync.
rsync 被用在UNIX / Linux执行备份操作操作.
rsync 工具包被用来从一个位置到另一个位置高效地同步文件和文件夹. rsync可以实现在同一台机器的不同文件直接备份,也可以跨服务器备份.

rsync 语法如下

从语法结构我们可以看出, 源和目标即可以在本地也可以在远端. 如果是远端的话,需要指明登录用户名, 远端服务器名, 和远端文件或目录. 同时源可以是多个, 目标位置只能是一个.

说明:

-z: --compress 使用压缩机制

-v: --verbose 打印详细信息

-r: --recursive 以递归模式同步子目录

注意: 同步完成后, 我们会发现文件的时间戳timestamps发生了改变.

有时我们希望拷贝或同步时, 时间戳不要发生变化, 源文件是什么时间戳,目标文件就是什么时间戳, 这时我们需要使用 -a --archive 归档模式选项. -a 选项相当于7个选项的组合 -rlptgoD

-r, --recursive: 递归模式Recursive mode
-l, --links: 将符号链接当作符号链接文件拷贝, 不拷贝符合链接指向的文件内容.
-p, --perms: 保留文件权限
-t, --times: 保留修改时间戳
-g, --group: 保留用户组信息
-o, --owner: 保留用户信息(需要超级用户权限)
-D, 相当于 --devices --specials 的组合, 保留设备文件, 保留特殊文件.

同步完成后, 我们再来看文件属性, 时间戳信息得到了保留, 不仅如此文件的所有者 和所在组也得到保留.

说明: Pubkeys 是一个普通文件

使用rsync, 也可以从本地拷贝多个文件或目录到远端, 以下即为示例:

注意:
与本地文件拷贝不同的地方在于, 当拷贝文件到远程服务器时, 我们指定远程主机上的用户名, 服务器地址, 路径等信息, 类是于使用scp命令拷贝, 如果没有设置ssh免密码登录我们还需要提供远程用户的密码等信息.有时你不想频繁输入密码, 或者rsync运行在一个无人执守的脚本里面, 这是需要预先设置ssh免密登录, 或者使用结合expect命令,自动输入密码, 但是出于安全考虑, 密码需要加密. 所以在条件许可的情况下, 还是推荐设置ssh免密登录.

与示例 4 稍有不同, 这时远端目录或文件作为源位置, 本地目录或文件作为目标位置, 示例如下:

rsync 允许指定远程主机上运行shell命令.
这时需要使用 -e 选项:
-e, --rsh=COMMAND 指定远端使用的shell命令

Use rsync -e ssh to specify which remote shell to use. In this case, rsync will use ssh.

在一下特殊的使用场景中, 我们不希望拷贝文件时, 我们不希望拷贝过程覆盖掉目标位置中用户做出的修改. 这时我们需要使用 -u 选项明确的告诉rsync命令保留用户在目标文件中作出的修改. 在下面的例子中, 文件Basenames是用户基于上次的拷贝, 修改过的文件, 当我们使用了-u 选项后, 该文件中的修改将不会被覆盖掉.

在某些特殊场景中, 我们只需要远程服务器上的目录结构, 而不希望花大量时间, 带宽拷贝文件内容, 这时我们可以使用 -d, --dirs选项来达到目的.

有时我们希望拷贝文件时, 能实时的显示拷贝进度, 以及传输速率等信息. 尤其是拷贝大文件时, 程序不输出信息, 用户往往无法区分程序是在响应中, 还是已经挂起, 在这种情况下如果使用 –progress 就会非常有帮助.
rsync –progress option displays detailed progress of rsync execution as shown below.

你也可以使用rsnapshot工具 (rsnapshot会调用rsync)来备份本地linux服务器, 或者备份远程linux服务器.

有时我们希望目标文件和源文件保持严格一致, 不要多文件也不要少文件, 这是我们可能需要使用 -delete 选项来达到目的. 如果使用 -delete 选项, rsync将删除目标位置多余的文件或文件夹. 此选项还可以结合--delete-excluded 选项一起使用, 添加一些例外的文件.

上述示例中, new-file.txt 是源文件中没有的文件, 其将会在拷贝时被删除掉.

在某些特殊的场景下, 我们只想更新, 目标位置已经存在的文件或目录, 而不关心源位置的新文件, 这时我们可以使用-existing 选项仅仅更新已经存在的文件.
让我们来验证一下这个选项的功能, 首先在源端添加一个新文件 new-file.txt.

从上面的例子可以看到, 由于加了--existing选项新文件new-file.txt没有被拷贝到目标位置

选项-i, --itemize-changes 非常有用, 当我们想了解目标位置和源位置的文件差异时.

在源端:

在目标端:

注意: 在上面的例子中, 源位置和目标位置有两处差异. 第一, 源文件Basenames的所有者和组 与 目标文件不同, 第一Dirnames文件大小也不一样.
现在让我们来看看rsync会怎样显示这些差异

输出信息只在相应文件前面显示了9个字母来标识改变, 这些字母具体是什么意思呢? 请参考以下详细说明

rsync 可以使用--include 和 --exclude 选项结合通配符进行文件或文件夹过滤

在上面的示例中, 仅仅以P打头的文件和文件夹被包含了进来, 其他的文件都被过滤在拷贝的过程中被排除在外了.

可以使用--max-size 告诉rsync 不要拷贝大小超过某个值的文件, 可以使用K, M, G指定文件大小, M for megabytes and G for gigabytes.

rsync 有个重要优点就是, 可以做到在拷贝的过程中, 只拷贝发生变化了的部分, 而不是发送整个文件.
但是在某些场景中, 比如文件较少, 文件size较小时, 我们的带宽又足够大, cpu资源相对又贫乏, 我们不希望它这样做, 因为毕竟计算源端和目标端的checksum, 并做对比, 也需要额外cpu开销. 这时我们可以使用 -W, --whole-file 选项, 让rsync不用计算那么多, 一上来就直接开始传送文件. 我们可以像下面这么做.

15个Rsync命令实例

4. 怎么svn服务器上的 数据库备份到本地

将本地的记录修改成与服务器上的一致。也就是说,将本地与服务器上不同的地方,改成与服务器上的一样。
svn备份一般采用三种方式:
1)svnadmin mp
2)svnadmin hot
3)svnsync.

注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如命令、rsync命令。
笔者曾经用 rsync命令来做增量和全量备份,在季度备份检查审计中,发现备份出来的库大部分都不可用,因此最好是用svn本身提供的功能来进行备份。

优缺点分析
==============
第一种svnadmin mp是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
缺点是:如果版本比较大,如版本数增长到数万、数十万,那么mp的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
个人建议在版本数比较小的情况下使用这种备份方式。
第二种svnadmin hot原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份;
优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
缺点是:比较耗费硬盘,需要有较大的硬盘支持(俺的备份机有1TB空间,呵呵)。
第三种svnsync实际上是制作2个镜像库,当一个坏了的时候,可以迅速切换到另一个。不过,必须svn1.4版本以上才支持这个功能。
优点是:当制作成2个镜像库的时候起到双机实时备份的作用;
缺点是:当作为2个镜像库使用时,没办法做到“想完全抛弃今天的修改恢复到昨晚的样子”;而当作为普通备份机制每日备份时,操作又较前2种方法麻烦。

5. svn数据库怎么防止拷贝

采用三种方式:
1)svnadmin mp
2)svnadmin hot
3)svnsync.
注意,svn备份不宜采用普通的文件拷贝方式(除非你备份的时候将库暂停),如命令、rsync命令。

6. 从linux中同步文件夹的软件

用rsync命令同步就行了
rsync可以让两个目录的内容一致,它同步只会同步有更新过的文件,减少传输量。可以是本机上的两个目录,也可以是本机的目录同步到服务器上,还可以是把服务器上的目录同步到本机上。
基本命令是 rsync 命令的参数 源目录 目的目录
rsync可以基于ssh协议来做,这样就省去了很多配置rsync server的麻烦,如果两个机器已经实现ssh无密码登陆,那么rsync就会提示输入密码,还有一种是通过密钥文件来实现免密码,例如下面
1、rsync -vzrtopg --progress -e ssh --delete 用户名@服务器IP:/var/www/dirA/ /var/bak/
2、rsync -vzrtopg --progress -e "ssh -i /path/pwd.pem" --delete 用户名@服务器IP:/var/www/dirA/ /var/bak/

就是把服务器上的dirA目录同步到本地的/var/bak目录下,其中方法1是用户已经做了ssh免密码登陆,方法2是通过密钥(存放在/path 下的pwd.pem文件)来同步

7. 如何通过rsync+sersync 实现同步备份

如何通过rsync+sersync 实现同步备份
3、rsync+sersync更快更节约资源实现web数据同步
4、unison+inotify实现web数据双向同步
一:为什么要实现同步备份
服务器上有些重要文件或数据时,可以把他们多备份一份到其他服务器上,这样就不怕数据或文件丢失了。
二:环境的搭建
服务器A:192.168.1.10 源服务器
服务器B: 192.168.1.20 目的服务器
我们要实现的就是把A服务器上的文件同步到B服务器上,从而实现备份。我们主要是在B服务器上安装配置rsync,在A服务器上安装配置sersync,通过sersync把文件推送到B服务器上
三:开始搭建
从B服务器开始:
1.关闭selinux,在/etc/sysconfig/selinux 这个文件,设置SELINUX=disable
2.防火墙开通873端口 -A INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT
3.开始安装rsync
yum install rsync -y
4.配置rsync,rsync的配置文件是/etc/rsyncd.conf,配置如下:

图下方需要注意的地方:secrets file这个是配置同步的密码文件的。[rsynctest]这个是配置同步模块的名称,path是配置同步的目录,hosts allow是允许同步的主机,hosts deny:拒绝同步的主机
5.创建同步的用户与密码的文件,即上图中的secrets file这个配置选项中的文件。/etc/rsync.passwd,同进要设置这个文件的权限为600
echo "user:password" >> /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
6.创建同步的目录:即上图中path配置选项中的目录。
mkdir /home/rsynctest
7.启动rsync
rsync --daemon --config=/etc/rsyncd.conf
接着重启一下xinetd
/etc/init.d/xinetd restart
8.配置开机启动 echo "rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.d/rc.local
到这样B服务器基本就配置完成了。
接着配置A服务器:
1.先到sersync官网下载sersync:http://sersync.sourceforge.net/
wget http://sersync.googlecode.com/files/sersync2.1_64bit_binary.tar.gz
2.安装sersync
# mkdir /usr/local/sersync
# mkdir /usr/local/sersync/conf
# mkdir /usr/local/sersync/bin
# mkdir /usr/local/sersync/log
# tar zxvf sersync2.5_32bit_binary_stable_final.tar.gz
# cd GNU-Linux-x86/
# cp confxml.xml /usr/local/sersync/conf
# cp sersync2 /usr/local/sersync/bin

3.创建密码文件,同B服务器一样,不过这个文件只要保存一个密码就行了,不用用户名,权限也是600
echo "password" >> /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

4.配置sersync,配置文件就是上第二步复制的confxml.xml这个文中,路径在/usr/local/sersync/conf中
---------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
# 设置本地IP和端口
<host hostip="localhost" port="8008"></host>
# 开启DUBUG模式
<debug start="false"/>
# 开启xfs文件系统
<fileSystem xfs="false"/>
# 同步时忽略推送的文件(正则表达式),默认关闭
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
# 设置要监控的事件
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>
<sersync>
# 本地同步的目录路径
<localpath watch="/data">
# 远程IP和rsync模块名
<remote ip="192.168.1.20" name="data"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
# rsync指令参数
<commonParams params="-auvzP"/>
# rsync同步认证
<auth start="true" users="user" passwordfile="/etc/rsync.passwd"/>
# 设置rsync远程服务端口,远程非默认端口则需打开自定义
<userDefinedPort start="false" port="874"/><!-- port=874 -->
# 设置超时时间
<timeout start="true" time="100"/><!-- timeout=100 -->
# 设置rsync+ssh加密传输模式,默认关闭,开启需设置SSH加密证书
<ssh start="false"/>
</rsync>
# sersync传输失败日志脚本路径,每隔60会重新执行该脚本,执行完毕会自动清空。
<failLog path="/usr/local/sersync/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
# 设置rsync+crontab定时传输,默认关闭
<crontab start="false" schele="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
# 设置sersync传输后调用name指定的插件脚本,默认关闭
<plugin start="false" name="command"/>
</sersync>
# 插件脚本范例
<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin>
# 插件脚本范例
<plugin name="socket">
<localpath watch="/opt/tongbu">
<deshost ip="192.168.138.20" port="8009"/>
</localpath>
</plugin>
<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<senrl base="http://pic.xoyo.com/cms"/>
<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
</localpath>
</plugin>
</head>
------------------------------------------------------------------------------------------------------------------

5.创建同步目录:mkdir /home/rsynctest
6.设置环境变量:
# echo "export PATH=$PATH:/usr/local/sersync/bin/" >> /etc/profile
# source /etc/profile

7.启动sersync
sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml
注:重启操作如下:
# killall sersync2 && sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml

8.设置开机启动
# echo "sersync2 -r -d -o /usr/local/sersync/conf/confxml.xml" >> /etc/rc.local

更多详情可以看http://www.cnblogs.com/myblog1314/p/4569797.html这个里面的

8. SVN的操作说明以及备份策略

2.1 文件检出
安装TortoiseSVN后,SVN会跟Windows的资源管理器完美集成。点击右键,我们可以在菜单栏中选择“SVN检出”选项,输入要检出代码的文件库的URL地址,我们就可以检出该URL地址下的文件库的文件。默认情况下是检出最新版本的代码,如果需要,我们可以通过浏览日志,根据日志来找出想要的版本,然后在“版本”选项中指定相应版本就可以检出相关代码了 。
之后,对于同一个项目的主干开发,我们都在这个检出的代码文件目录下操作,而不是每一次提交或更新都重新检出一次。
2.2 文件添加
我们在本地创建的文件(包括目录)不会受SVN的控制,为了让其接受SVN的控制必须将其添加到文件库中。对于团队其他成员需要的文件,如代码文件、某些模块的.a文件(由于某些需要,该模块代码不公开),我们必须让它们接受SVN的控制,并且保持最新的版本。
2.3 文件删除
当我们需要删除无用的文件(包括目录)时,不能使用Windows的资源管理工具,而必须使用SVN本身的删除文件功能。这样该文件被删除后,其所有修改历史仍然保存在SVN服务器中,以后仍然可以获得该文件的修改历史。
2.4 文件改名
当我们需要对文件(包括目录)进行改名的时,不能使用Windows的资源管理工具,而必须使用SVN本身的文件改名功能。这样该文件被改名后,其改名前的所有修改历史仍然保存在SVN服务器中,保持连续的修改信息。
2.5 文件更新
其他团队成员提交到SVN上的改动不会自动更新到你的本地拷贝中来,我们需要通过更新文件操作来获取其他成员对项目文件所做的修改。SVN更新文件操作会把文件库里的文件与本地文件进行合并,从而达到了同时保留其他成员的修改及本地的修改的目的。如果无法自动合并则会发生冲突,需要使用文件比较工具进行手工合并,合并完成后才能提交已解决冲突的文件。冲突的详细解决方法见第三章——冲突解决。
在团队开发时,更新是一件很重要的工作,可以保持团队成员之间的工作内容一致,因此要注意经常更新自己的工作拷贝,以保证自己能够获得最新的修改内容。
2.6 改动提交
我们对文件(包括目录)所做的一切改动,包括添加、删除、修改文件都必须提交到SVN服务器文件库中才能正式生效,之后团队的其他成员才可以获取你所作的修改。
提交是很重要的一项操作,要求做到:
 提交代码之前一定要保证修改后的代码能编译通过,不能提交编译不通过的代码。
 比较修改前及修改后的代码,把调试信息或其他不相关的信息去掉,再次确保提交的代码是正确的并且提交的是需要提交的文件。
 不要等到修改了很多代码才提交,而是相关小功能完成时就应该提交一次。这样以后发现问题时就很容易撤销有问题的代码——因为撤销只能针对一次提交,所以在一次提交里涉及过多的功能是不推荐的。
 提交时必须填写log信息,说明这次提交增加了什么功能或者修正了什么bug。这些信息有助于自己和其他团队成员了解整个项目的历史。当出现问题时也方便定位到对应的版本代码,所以log信息必须足够详细。
 事务性提交。也就是说提交要么成功,要么全部失败——即提交出现错误时会自动回滚,实际上没有提交任何东西。出现错误时,解决错误,再次提交上次提交的全部内容即可。
3. 冲突解决
冲突的解决是我们使用SVN过程中的一个棘手问题,所以独立一节来谈论。
3.1 冲突的产生
冲突发生在多个成员同时对同一个文件进行修改的情形下。即当有其他成员已经提交了修改,而自己在本地拷贝中也对该文件进行了修改,而且修改的是同一个地方,那么在进行本地文件的更新时,SVN会不知道该选择那个修改(SVN上的修改还是本地的修改)来进行合并,所以冲突就产生了。
举例说,假如受SVN控制的文件Day.txt在SVN服务器上的当前内容如下:
图表 3 Day.txt文件在本地的修改
我们可以看到,在文本的第一行,SVN上及本地都做了修改。这样当在本地进行更新(提交之前必须先更新),SVN合并时就不知道monday后面到底该是work还是sleep,所以冲突就产生了。
而第三、五行是各自进行了修改,并没有冲突,所以这两行可以顺利合并,合并后可以看到所有人所做的修改。
3.2 冲突的解决
冲突发生后,SVN会在本地保存该文件的不同修改版本,见下图蓝色图标:

图表 4 Day.txt文件的不同版本
 Day.txt.r35是版本35的Day.txt文件(本地拷贝最新版本)
 Day.txt.r37是版本37的Day.txt文件(SVN上最新版本)
 Day.txt.mine的是本地修改后的Day.txt文件
 Day.txt文件中包含了合并后的内容
3.2.1 简单冲突解决
对于简单的内容冲突,我们可以直接在合并后的文件上修改。在上例中,我们打开Day.txt文件,可以看到SVN合并后的内容:

图表 5 Day.txt合并后内容
我们看到没有冲突的修改:(play basketball)及(meeting)顺利地合并了,而冲突的部分出现了一些标记。其中标记
<<<<<<< .mine
=======
之间包含的是本地修改的冲突部分的内容,即monday(work)。而标记
=======
>>>>>>> .r37
之间包含的是版本37(SVN上最新版本)该部分内容,即monday(sleep)。
不失一般性,假如我们现在要保留的内容是monday(work),那么我们只要把标记及monday(sleep)部分内容去掉即可:

图表 6 Day.txt解决冲突后内容
确保修改正确后,把Day.txt文件设置为“已解决的”。

图表 7 Day.txt标记为已解决
之后,后缀为mine,r35,r37文件全部消失,仅保留已解决冲突的Day.txt文件,提交到SVN即可。
3.2.2 复杂冲突解决
对于文件内容复杂的文件,上述的解决方法容易漏掉一些要修改的部分,解决起来也耗时耗力。这时要通过SVN提供的工具来解决。
选择SVN功能“编辑冲突”,打开冲突编辑工具:

图表 8 冲突编辑工具
上半部分的两个内容栏分别显示的是版本37的内容及本地修改的内容。
下半部分的内容栏显示的是合并后的内容。
每个内容栏左边的标记清楚地标识了该文件做了那些修改。
文件冲突的部分用红色显眼地表示了出来。在合并栏,点击冲突部分,点击右键,我们可以选择用哪个内容(SVN上最新内容或者本地修改内容)来解决冲突部分,也可以选择两个内容都使用,同时选择它们出现的先后顺序。
逐一解决各个冲突。确保所有冲突都解决后,保存文件,并标记为“已解决”的,退出该工具即完成冲突的解决。
4. 加锁策略
事实上,解决冲突还有一种方法,那就是“严格加锁”。
“严格加锁”要求在编辑文件之前必须先对文件加锁,然后才能进行编辑。此时团队其他成员不能对该文件进行编辑,即保证了同一时刻只有一个人在编辑该文件,因此避免了冲突的出现。
那么,什么类型的文件我们应该采取“严格加锁”呢?
 Excel、图片等不可合并的文件,我们必须对其“严格加锁”。“严格加锁”的文件都标记为“可读”的,即不可编辑。要编辑这些“严格加锁”的文件,必须先对其加锁,加锁后文件更改为“可读可写”。编辑完这类文件后要第一时间提交。提交完成时,SVN会自动解开任何你拥有的锁 。
 文本文件,比如程序代码,SVN通常可以为我们合并改动,无须“严格加锁”。对于一些大家都频繁改动的重要源代码文件,可能会引起大量冲突,我们也不推荐“严格加锁”,因为加锁会导致大家持续得走来走去去询问加锁情况。正确做法是把文件分成数个逻辑单元,大家都修改各自的单元,减少合并时的冲突。
5. 标签&分支
一个项目最初存放的目录我们称之为主干(trunk)。下面我们讨论除了主干之外其他存放项目的目录——标签(tag)和分支(branch)。
5.1 标签(tag)
版本号可以区分多次的代码修改,我们可以使用版本号来检出需要的代码,但对于重要版本的代码,如第三版发布代码,我们不希望记住r37这样的数字。这时,我们就可以通过创建标签来对SVN中这个发布版本的文件的这个时刻的状态创建一个“快照”,以后就可以通过这个标签名字来检出第三发布版本的代码。
标签其实是当前项目文件的简单拷贝,保存在标签所在的目录下。创建标签也是挺简单的,不过要注意:
 标签的名字一定要有描述性,可以仅凭名字就知道为什么要创建标签。
 不能过多地使用标签,只有在重要时刻或者发布版本时才可以创建标签。
 标签是项目文件在某个时刻的状态,不能对其进行修改 。
5.2 分支(branch)
分支跟标签一样,也是当前项目文件的简单拷贝,保存在分支所在的目录下。
分支跟标签的根本区别在于,标签不能对其进行修改,而分支就是为了某种目的的修改而建立的。在检出代码时检出指定分支即可,分支的操作跟主干上的操作完全相同。
5.2.1 何时创建
遇到下述情况,我们可以通过创建分支来解决问题:
 发布分支
当我们快要发布一个版本了,一个开发小团队要为这次发布做好准备,比如说修改一些收尾的bug。这时他们需要的是项目的稳定性,而同时我们还有其他团队要开发预计下次发布才会添加进去的功能,显然他们不能在同一份代码上工作,因此我们需要从主干中建立出一个发布分支,发布团队都从这个发布分支检出及提交代码。当程序被发布之后,这个分支依然是活动的。这样,如果客户报告了一些bug,团队会在这个发布分支中修正它们并视情况合并到主干中去。
 试验分支
当我们需要对项目做大范围的改动,并且这改动对系统的其余部分有深远的影响,而我们又不能保证这次改动一定能成功的时候就可以建立试验分支。如果试验失败了,可以废弃这个分支;成功了我们只要把分支的改动合并到主干代码中去就可以了。
其他情况,我们不建议创建分支,更不推荐在分支上创建分支,因为分支过多,合并时的冲突将会是一种难于解决的灾难。
5.2.2 合并分支
我们在分支上所修正的bug很可能在主干上或者其他分支上也存在,因为它们往往来自同一份代码,所以我们在分支上所做的改动有必要合并到主干或者其他分支中去。
对于简单的bug,一次提交就能解决问题的,那么我们只要记住提交新版本号,然后使用新版本号把改动合并到其他的受影响的主干及分支中去就可以了。
对于复杂的bug,可能需要多个开发者花几天的时间提交多次才能修好。这时光用版本号来记住修改的内容就有点勉为其难了。因此,我们可以使用标签来标记我们修正过程的开始和结束,然后使用这些标签帮助我们把修正的代码合并到主干和其他分支中去。整个过程如下:
① 给分支打个标签,标记bug修改开始。
② 测试重现bug,修正代码让新测试通过。
③ 提交你的改动到SVN上。
④ 重复步骤2、3,直到确定bug已经修正。
⑤ 再给分支打个标签,标记bug修正结束。
⑥ 使用两个标签来把修正的代码合并到所有其他受影响的主干和分支上。
6. 注意事项
经常更新
 由于文件可能有多个人修改,应该经常更新你的工作拷贝中的文件,这样能降低发生冲突的可能性。
测试提交
 提交前先在本地进行测试。不允许将有错误的文件提交到SVN服务器上。
填写备注
 提交时一定要写备注:备注有助于其他人(包括三个月后的你自己)理解你对文件所做的修改。
整体提交
 提交文件时注意要提交一项改动所对应的所有文件,不要一次提交一个文件或者一次提交修改了很多功能的一堆文件。
发布标签
 对于每一个发布的版本都要建立标签:当用户告诉你发生某个问题时,你可以迅速地追踪到问题是在哪个版本引入的 。

附:测试自动化小组SVN使用指导原则
1. Project的构建
Project在SVN服务器上的目录架构如下:

SVN上的项目文件:
1. 必须保证Trunk上的代码是最新的!定期对Trunk上的代码进行更新,各小组可根据各自实际情况自己把握
2. Tag是根据项目需要所打的标签,每一个发布的版本都要打Tag,主要是方便有需要时可以直接根据Tag返回到之前的状态,以便于分析、测试;Tag中必须包含相应的release文件及当时编译或发布时的源代码,必须有相关的文档注明项目背景、发布情况等。
3. Branch文件夹可以用作备份用,可以用个人名字命名文件夹;此外,Branch分支主要用来进行短暂或者探索性的开发使用,最终的软件版本必须更新、合并到Trunk主干上。
4. 关于同一项目组开发环境的建议:同一项目组成员的开发环境最好一致,软件安装路径和Project文件存放路径最好一致。
2. 版本号
关于版本号命名规则:主版本号.子版本号.修正版本号
1. 项目初版本时,版本号为0.1.0;
2. 当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1;
3. 当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,修正版本号复位为 0;
4. 当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1,子版本号和修正版本号复位为0;
5. 编译版本号一般是编译器在编译过程中自动生成的,我们只定义其格式,如果编译器不能自动生成,人手添加,数值代表为当前的系统时间。
例子:V1.0.1 Build090305 Rel111123
其它版本使用规则:
1. α(alphal)内部测试版
此版本表示该软件仅仅是一个初步完成品,只在组内内部交流,该版本软件的 bug 较多,限内部测试使用。
例子:V0.1.1 Build090305 alphal1
2. β(beta)外部测试版
该版本相对于α版已有了很大的改进,经过组内的测试,消除了严重的错误,但还是存在着一些缺陷,需要经过大规模测试来进一步消除。
例子:V0.1.2 Build090305 beta1
3. demo 演示版
仅限评审或讲解时做介绍使用。
例子:V0.1.3 Build090305 demo1
4. release 最终版
该版本意味“最终释放版”,在出了一系列的测试版之后,终归会有一个正式版本,一般情况下,release不会以单词形式出现在软件封面上,取而代之的是符号 (Rel) 。release版本发布时,必须将待发布的软件和相应版本更新记录打包在一起发出。
例子:V1.0.1 Build090305 Rel111123
3. 权限限制
如果项目本身需要对项目组成员作不同的权限控制,可以考虑维护两个工程:一个工程里面有相应的源文件,一个则只有编译后的文件。
4. 模块的版本维护
1. 文件一般不需要版本,但要有详细的更新历史记录;
2. 模块可以以版本来维护,具体可以不同的文件夹区分。

阅读全文

与rsync过滤svn相关的资料

热点内容
乐美荣饮水机怎么装水 浏览:211
酿酒一元天锅蒸馏 浏览:201
为什么养殖业污水难处理 浏览:1000
韩国世韩ro膜和沁园 浏览:339
秦皇岛家用净水器排名哪个好 浏览:114
揭阳污水处理提标改造多少钱 浏览:155
西安污水池清洗公司 浏览:912
迷你发光字树脂发光字区别 浏览:261
阳离子交换吸附作用是一种可逆反应 浏览:705
化学edi 浏览:371
沃克净水机产生多少废水 浏览:425
戴森净化器hp00怎么清洗滤网 浏览:788
超滤膜可做RO前置吗 浏览:911
清除电水热水瓶的水垢 浏览:422
水瓶里面放酸醋可以去水垢吗 浏览:307
广州化学实验废液污水怎么处理 浏览:436
edi证查询 浏览:974
钢管防腐环氧树脂漆分类 浏览:719
环氧树脂自流平材料技术要求 浏览:497
蒸汽炉除垢剂的用法 浏览:298