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

subversion:


简介:

subversion是一个自由/开源的版本控制系统

-->subversion允许你的数据恢复到早期版本

-->或者是检查数据修改的历史 


架构:

客户端—命令行,图形

通信方式—本地访问,svn服务器,web服务器

仓库存储—文件系统(FSFS),数据库(Berkeley DB)


基本概念:

典型的客户/服务器系统

--》版本库是版本控制的核心

--》任意数量的客户端

--》客户端通过写数据库分享代码

subversion特点

--》记录每一次改变


版本模型:

版本控制系统的核心任务是协作编辑和数据共享

文件共享的问题

--》如何允许用户共享信息

--》防止版本库数据被别人意外覆盖


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


服务端(192.168.4.1):

安装:

#yum -y install subversion


创建版本库:

#mkdir /var/svn

#svnadmin create /var/svn/project1


导入项目代码:

#svn import /etc/rc.d/init.d/ file:///var/svn/project1/ -m 'Init Data'  //-m 添加说明性字符串(相当于日志)


认证与授权:

#vim /var/svn/project1/conf/svnserver.conf

anon-access = none

//设置拒绝匿名访问,此处可以设置为none、read、write

auth-access = write

//经过认证的用户为可写权限

passwd-db = passwd

//账户名称与密码的存放文件民,在conf目录下

authz-db = authz

//基于路径的访问控制文件名(可以对文件或者目录设置权限)


在passwd文件中设置账户信息:

#vim /var/svn/project1/conf/passwd

[users]

tom = tom123

jerry = jerry123 //用户名jerry密码jerry123


在authz文件在中设置访问控制权限:

#vim /var/svn/project1/conf/authz

[groups]

tom_and_jerry=tom,jerry //定义组账户,组成员tom和jerry

[/]

@tom_and_jerry = rw

* = r

//tom和jerry由读写权限,其他人只有读权限


启动服务:

#systemctl start svnserver

#systemctl enable svnserver

#netstat -lnpt | grep :3690


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


客户端测试:

1、客户端下载svn服务器上的项目文件

#cd /opt

#svn --username tom --password tom123 checkout  svn://192.168.4.1/project1 code1

//以tom身份下载服务端版本库文件到本地,命名为code1

#cd code1/

#svn log //查看日志信息

2、更新本地工作副本

#svn update

3.新建文件测试:

vim foo.sh

#!/bin/bash


if [ "$1" == "foo" ]; then

    echo "bar"

elif [ "$1" == "bar" ]; then

    echo "foo"

else

    echo "$0 foo|bar"

fi


#svn add foo.sh //将foo.sh加入svn本地管理

#svn diff //显示服务器与本地的区别

将本地工作副本同步到服务器:

#svn commit -m "Add foo.sh to project1"


4、新建目录

# svn mkdir subdir

# svn status   #查看状态

5、删除文件

# rm cups.service   # 本地删除

# svn update        # cups.service将重新下载

# svn delete cups.service  # 在svn中删除文件

# svn status 

# svn move foo.sh bar.sh  # 在svn中改名

# svn commit -m "rename foo.sh, del cups.service, mkdir subdir"

6、练习

# sed -i '1a###test###' sshd.service 

# sed -i '2a###mytest###' sshd.service

# svn diff sshd.service //仅查看sshd.service中改变的内容

# svn diff 

# svn log svn://192.168.4.1/project

# svn commit -m "modify sshd.service"

7、将sshd.service回退到增加两行之前的状态

# svn merge -r4:2 sshd.service //4指当前版本,2指要回到的版本

# vim sshd.service  第六步新增的两行消失

8、将svn的第2版本的文件全部下载下来,叫做code2

# svn co -r2 svn://192.168.4.1/project code2


多人协作

1、tom和jerry分别下载了svn上面的项目

# cd /opt/

# svn co --username tom --password tom123 svn://192.168.4.1/project tom

# svn ls --username tom --password tom123 svn://192.168.4.1/project 

# cd /var/tmp/

# svn co --username jerry --password jerry123 svn://192.168.4.1/project jerry

2、不同用户修改不同文件

# cd tom/

# sed -i '3a#####my test####' vmtoolsd.service 

# svn commit -m "tom modify vmtoolsd.service"

# cd jerry/

# sed -i '3a#####jerry test####' sshd.service 

# svn commit -m "jerry modify sshd.service"

# svn update  #tom修改的vmtoolsd.service同步到本地

# svn update 

//修改完只需要同步到服务器

3、不同用户改变相同文件的不同行

# sed -i '1a####tom modify###' user.slice 

# svn commit -m "tom modify slice.user"

# sed -i '$a###jerry modify###' user.slice 

# svn commit -m "jerry modify user.slice"  #失败,因为文件过时了(本地版本号低于服务器上的版本号)

# svn update  #更新到最新版本

# svn commit -m "jerry modify user.slice"  #重新提交

# vim user.slice  # tom和jerry的修改全部存在

//后修改需要先svn update与服务器版本号一致,才可上传

4、不同用户改变相同文件的相同行

# sed -i '8c#####tom tom tom####' zram.service 

# svn commit -m "tom modify zram.service"

# sed -i '8c####jerry jerry####' zram.service 

# svn commit -m "jerry modify zram.service"

# svn update    //选择p   

  //postpone 标记冲突,稍后解决   

  //df 对比不同 

    //edit 直接修改文件,修改后选择r 

                //mine-conflict 冲突以本地为主

                //theirs-conflict 冲突以服务器为准  


# ls zram.service*

# mv zram.service.mine zram.service //将自己的版本设置为服务器的版本

# ls zram.service*

# rm -f zram.service.r*

# ls zram.service*

# svn commit -m "jerry modify zram.service"


//需要通过选择手动解决冲突


5、svn服务器端备份

# svnadmin dump /var/svn/project/ > /var/tmp/project.bak


6、还原

# rm -rf /var/svn/project/

# ls /var/svn/

# svnadmin create /var/svn/project/

# svnadmin load /var/svn/project/ < /var/tmp/project.bak 


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


RPM打包:

流程:

--》准备源码包

--》安装rpm-build

--》编写编译配置文件

--》编译RPM包


1.源码包

nginx-1.8.0.tar.gz


2.安装编译打包RPM的工具:

#yum -y install rpm-build


3.生成工作目录:

#vim nginx.spec //直接存盘退出

#rpmbuild -ba nginx.spec //出现任何错误,忽略,运行完后,生成了rpmbuild目录


4、把素材放到正确目录

# mv nginx-1.8.0.tar.gz rpmbuild/SOURCES/

# mv nginx.s* rpmbuild/SPECS/


5、修改说明文件

# vim rpmbuild/SPECS/nginx.spec 

Name: nginx //软件名称

Version: 1.8.0 //版本信息

Release: 1%{?dist} //RPM版本

Summary: nginx high performance web server //描述


Group: application/web server //软件组

License: GPL //协议

URL: http://www.tedu.cn //网址

Source0:nginx-1.8.0.tar.gz //源码文件


BuildRequires: gcc pcre-devel openssl-devel zlib-devel //编译时的依赖包

Requires: pcre openssl zlib //安装时的依赖包


%description

nginx high performance web server compiled  by dcc //详细描述


%prep //安装前准备,解压

%setup -q //系统使用setup-q,安静模式


%build //编译时需要执行的命令

./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module

make %{?_smp_mflags}



%install //安装是需要执行的指令

make install DESTDIR=%{buildroot} //实现systemctl启动

mkdir -p %{buildroot}/usr/lib/systemd/system 

install /root/rpmbuild/SPECS/nginx.service %{buildroot}/usr/lib/systemd/system



%files //定义打包文件列表

%doc

/usr/local/nginx/*

/usr/lib/systemd/system/nginx.service


%pre //预先创建普通用户nginx

useradd -s /sbin/nologin nginx


%changelog //软件修改历史


6、安装依赖包

# yum install -y gcc openssl-devel zlib-devel pcre-devel


7、生成rpm包

# rpmbuild -ba rpmbuild/SPECS/nginx.spec 


8、验证

# ls rpmbuild/RPMS/x86_64/

# rpm -q nginx

# rpm -ihv rpmbuild/RPMS/x86_64/nginx-1.8.0-1.el7.x86_64.rpm 

# rpm -q nginx 

# yum info nginx

# systemctl start nginx.service 

# systemctl status nginx.service