##########################################################################################
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