SVN 版本控制
Subversion 是一个自由/开源的版本控制系统
其作用是解决,在团队合作中,很多人共同完成一个文件,就会导致每个人负责的部分在修改中出现很多版本,而这些文件之间毫无关联,这样很难合作,这时候就用到SVN。
在SVN出现前,工程师想了很多个办法试图解决,不过结果都不太好。
起初,想用ftp等共享目录的办法,让所有人把文件修改好传到一个位置,可这样如果后一个人写的覆盖前一个人的,会导致前一个人的操作失效,这肯定是不可以的;
后来,使用读写锁的办法,都是对一个文件进行操作,一个人写的时候,另一个人不能写,所有人都修改这一个文件,这样就可以实现文件的共同修改,不过问题也不小,这方法会导致,一个文件一次只能一个人改,这人改完才到下一个,这样效率很低;
现在,用的SVN工作原理是,每个人把文本下载到本地,然后修改自己的部分,再上传到SVN中,如果SVN中最新的版本就是,你下载的版本,就会把你的上传的文件改成最新版本,如果SVN当前最新版本不是你当时下载的版本,SVN会自动合并你和你下载的版本后的所有修改记录的信息,然后将修改后的文件变成最新版本,如果中间有冲突,就要人工干预了。
现在除了SVN,还有GIT也能做到这个,两个原理差不多。
SVN 的搭建
1. 装包: yum install -y subversion
创建用于存储svn信息和数据的目录:先mkdir创建预备被共享的目录的父目录,再用svnadmin create创建共享目录
例如:预备共享/a/b/c/d/e 那就要先 mkdir -p /a/b/c/d, 再svnadmin create /a/b/c/d/e
2. 修改配置文件 /刚刚好创建用于存储svn信息和数据的目录/conf/的三个文件,
先改svnserve.conf
anon-access = none # 匿名用户的权限,none是无权限,read是读权限,write是读写权限
auth-access = write # 有效用户的权限,即通过正确的用户密码登陆的用户的权限
password-db = passwd # 用户的用户名和密码的信息记录,默认即可
authz-db = authz # 具体权限的设置,默认即可
在原配置文件中都有,只不过被注释了,但是!要注意,所有配置必须顶格写,开头不能是空格
再改passwd
[users]
用户名 = 密码
在原配置文件中都有,只不过被注释了,不过开头还是不能有空格
最后改authz
[/目录位置]
用户 = 权限
目录位置的/代表的是svn创建的共享目录的位置,也就是svn的根目录,对于具体目录进行的权限分配,当某个子目录没有具体设置权限的时候会找其父目录,继承其权限
权限r代表读权限,w代表写权限,空代表无权限
注意: 对于用户权限的修改是实时的,不需要重启,改完权限会立刻生效
当然也可以选择创建子目录
在导入的时候,SVN根路径后面加上想创建的/子目录即可
3. 启动服务
svnserve -d -r /SVN的系统根路径
启动服务的时候必须有 [ -r /SVN的系统根路径 ] ,虽然不写可以启动,但是下面客户端在访问操作的时候必须在IP后面加上SVN的系统根路径,很麻烦
SVN 具体操作
服务端:
svn import 准备导入到SVN的本地文件 file:///SVN的绝对路径/SVN下的子目录(可以没有) -m "介绍"
导入后,会自动出现这个SVN子目录,在客户端可以访问
导入的是文件就会显示文件,导入的是目录就是目录,
没有子目录就全存在根目录下,有子目录就存在根下的子目录下的
客户端:
svn --username 用户 --password 密码 info svn://IP
第一次操作的时候需要进行用户名密码的认证,通过交互界面可以记住帐号密码,实现以后的所有操作不需要加上用户名密码的认证,而info就是显示SVN的版本信息
下面操作中不写本地目录默认是操作到当前目录
svn co svn://IP/子目录 本地目录 | 把SVN上的目录拷贝到本地的一个目录下 |
svn ci -m "描述" 本地目录 | 把本地下载的那个目录进行修改后,同步到服务器,注意本地目录一定要是从svn上下载下来的 |
svn update | 将服务器上新的数据同步到本地 |
svn log svn://IP/子目录 | 查看具体某个子目录的修改日志 |
touch /本地目录/文件名 svn add 文件名 svn ci -m "描述" |
创建一个文件上传到svn服务器中,要注意,新建的文件,不用add加入到svn服务器中,是不能用ci同步的,而add只是创建,其中没有数据,需要再ci才能完成创建文件的全部操作 |
svn mkdir 目录名 svn ci -m "描述" 本地目录 |
创建文件夹,并且上传到svn中 |
svn rm 文件名 svn ci -m "描述" 本地目录 |
删除文件,并且上传到svn中 |
svn diff 本地目录 | 查看svn服务器中的数据和本地目录的所有数据进行对比(对子目录不会对比) |
svn revert /本地目录/文件名 | 还原某文件 |
svn merge -r当前版本:还原至的版本 文件 | 将后文件还原到原来的某个版本的状态 |
注意:
1. 想用svn创建一个文件,需要在本地创建编辑后,用svn add 再用svn ci提交才能完成
而创建目录,svn mkdir 就可以了
2. 创建用户主要用 'svn add 文件名' ,不是简单的ci的进行更新,
3. svn不管怎么增删改查,都会有版本记录,哪怕记录删除了,也可以返回旧版本找回
多用户共同维护修改
1. 不同文件的编辑,两者互不干涉,修改完svn ci提交即可,然后如果要得到对方的修改的文件svn update即可同步文件
2. 对同一文件的不同行修改,第一个人修改完提交没有问题,但是第二个是提交会报错,这时候用svn update,就会自动同步,两人修改的部分,合并到一个文件中,不过必须全是不同行的修改,不然会有冲突。
注意:这里有个小的注意点,svn中允许用户端创建文件,只是用户端创建的文件,不能两人同时修改上传,不管是不是同一行,都会报错冲突无法同步到一个文件。
3. 对同一文件的同一行冲突,svn update不能解决只能人为干预,商讨后冲突正确方上传,错误方不上传即可,
如果冲突 svn update 会报错,然后让用户选择,
p 代表保留冲突,这不是解决问题,选择后会自动出现多个文件,有冲突比较文件,用户自己的文件,svn最新文件,以及用户修改的初版文件,可以根据需求修改保留
Df 代表比较不同点
mc 代表保留自己的
tc 代表保留svn上的
总结: 多用户处理不同文件,不存在任何问题,而如果修改同一文件,必须是服务端创建的文件,如果修改不同行,只需要后来修改的人在提交前用svn update 同步一下,svn会自动把两个文件合并,然后再上传即可了,不过如果是同一行就只能认为操作了
GPL 是一个开源协议
1. 随意复制 2. 随意修改 3. 再发布(但是具有继承性,再发布的软件也必须也是GPL协议的软件)
RPM包编译安装
装包:yum -y install rpm-build gcc pcre-devel zlib-devel openssl-devel
配置:
命令: rpmbuild -ba rpm.spec &>/dev/null
这命令会在当前目录下创建一个rpmbulid目录,里面也会有子目录,这就是用来做准备的
配置源码包,把源码包复制到rpmbuild/SOURCES下即可 修改配置文件 rpmbuild/SPECS/服务名.spec
Name:服务名
Version:版本号
Release: 第几次做rpm包
Summary: 简介
License: 协议(GPL开源协议……)
URL: 网址
Source0:源码包名
%post
安装后脚本
%description
软件具体介绍
%prep
%setup –q //自动解压源码包,并cd进入目录
%build
./configure
make %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
cp 脚本 %{buildroot}编译安装后的具体目录 // 想编译安装后把一些运行的脚本放到其目录下
%files
%doc
编译安装后的绝对路径/* //对哪些文件与目录打包
%changelog
安装:
rpmbuild -ba rpmbuild/SPECS/软件名.spec
Rpm包就保存在rpmbuild/RPMS/x86_64下