svn
svn
安装
yum -y install subversion
创建版本库
mkdir /var/svn/ #这不是仓库,只是一个普通目录
svnadmin create /var/svn/project #这是仓库
ls /var/svn/project/
conf/ db/ format hooks/ locks/ README.txt #空仓库,默认自带的数据库和版本文件
本地导入初始化数据,导入当前目录下的所有数据
cd /usr/lib/systemd/system/
svn import . file:///var/svn/project/ -m "Init Data"
-m 注释,导入的是什么,为什么要导入
导入之后不是明文存的,是以数据库的形式乱码存在的,所以看不到,但可以查整个仓库的大小变大了
修改配置文件,创建账户与密码
ls /var/svn/project/conf/
authz passwd svnserve.conf #从右向左改
vim /var/svn/project/conf/svnserve.conf
anon-access = none #匿名无任何权限
auth-access = write #有效账户可读可写
password-db = passwd #密码存放路径/var/svn/project/conf/passwd
authz-db = authz #对单独文件单独设置权限,ACL访问控制列表文件
vim /var/svn/project/conf/passwd
[users]
harry = 123456 #用户名和密码
tom = 123456 #用户名和密码
vim /var/svn/project/conf/authz
[/] #定义ACL访问控制目录或文件,没有标注的目录默认继承根,因为所有的目录都在根下
harry = rw #用户对项目根路径可读可写,* = ,表示除上边两个人之外的其他人没有权限
tom = rw
启动服务
svnserve -d -r /var/svn/project
#-d 放入后台,相当于&
#-r 指定共享目录的路径
验证
netstat -nutlp |grep svnserve
端口号3690
备注:启动时加不加r,对客户端的影响
不加r,这样访问
svn://服务器IP/var/svn/project
加r,可以这样访问
svn://服务器IP
客户端测试
建立本地副本,从服务器192.168.2.100上co下载代码到本地code目录,命令自动创建code目录
cd /tmp
svn --username harry --password 123456 co svn://192.168.2.100/ code
# co checkout
# 提示是否保存密码
# Store password unencrypted (yes/no)? yes
修改文件后再提交
cd /tmp/code # 一定cd到文件目录
vim user.slice # 挑选任意文件修改其内容
# 将本地修改的数据同步到服务器,ci是commit提交,-m之后可以添加注释:你修改的原因
svn ci -m "modify user"
# ci commit 提交
# -m 指定提交原因
更新本地数据
将服务器上新的数据同步到本地,只下载有修改的,把别人更新的新版本下载到自己的计算机
svn update
查看仓库信息
svn info svn://192.168.2.100 //查看版本仓库基本信息,可以看到最后一个是谁修改的
路径: .
URL: svn://192.168.2.100
版本库根: svn://192.168.2.100
版本库 UUID: 234ad8b5-1723-467f-8729-96a314ace092
版本: 12
节点种类: 目录
最后修改的作者: tom
最后修改的版本: 12
最后修改的时间: 2018-11-26 16:59:11 +0800 (一, 2018-11-26)
svn log svn://192.168.2.100 //查看版本仓库的日志
r12 | tom | 2018-11-26 16:59:11 +0800 (一, 2018-11-26) | 1 行
xx
r11 | harry | 2018-11-26 16:40:53 +0800 (一, 2018-11-26) | 1 行
xx
r10 | tom | 2018-11-26 16:39:46 +0800 (一, 2018-11-26) | 1 行
xx
r9 | tom | 2018-11-26 16:28:12 +0800 (一, 2018-11-26) | 1 行
xx
echo "test" > test.sh //本地新建一个文件
svn ci -m "new file" //提交失败,该文件不被svn管理
svn add test.sh //将文件或目录加入版本控制,让svn识别此文件,相当于共享此文件
svn ci -m "new file" //再次提交,成功
svn mkdir subdir //创建子目录,让svn识别此目录
svn rm timers.target //使用svn删除文件
svn ci -m "xxx" //提交一次代码
vim umount.target //任意修改本地的一个文件
svn diff //查看所有文件的差异
svn diff umount.target //仅查看某一个文件的差异
[root@web2 code]# echo "test" >> test.sh
[root@web2 code]# svn diff test.sh
Index: test.sh
===================================================================
--- test.sh (工作副本)
+++ test.sh (工作副本)
@@ -1 +1,2 @@
test
+test
[root@web2 code]# svn cat svn://192.168.2.100/reboot.target //查看服务器文件的内容
第一种情况:删除本地文件所有内容,但未提交
[root@web2 code]# sed -i 'd' tmp.mount
//删除文件所有内容,但未提交
svn revert tmp.mount #对于删了文件内容但尚未提交到svn服务器的,可以打此命令还原tmp.mount文件
第二种情况:删除了本地的文档,尚未删除
[root@web2 code]# rm -rf *.target
//任意删除若干文件
[root@web2 code]# ls -f | wc -l
339
[root@web2 code]# svn update
//还原
[root@web2 code]# ls -f | wc -l
400
第三种情况:不仅改了文件内容,还上传了
[root@web2 code]# sed -i '1a #test###' tuned.service
//修改本地副本中的代码文件
[root@web2 code]# svn ci -m "xxx"
//提交代码
[root@web2 code]# svn merge -r7:2 tuned.service
-r还原,从第七版本还原到2版本
[root@web2 code]# svn merge -r5:4 test.sh
将服务器上的test.sh的第五版本还原到第四版本
使用Subversion协同工作
2.1 问题
情况一:修改不同文件
修改相同文件的不同行
修改相同文件的相同行
修改代码
提交代码
update
人工解决冲突
步骤一:多人协同工作
1)远程连接两个终端,每个人下载代码本地副本,注意web1(192.168.2.100)和web2(192.168.2.200)代表了两个不同的主机,看清楚操作是在哪一台计算机上执行!
[root@web1 ~]# cd /tmp
[root@web1 ~]# svn --username tom --password 123456 co svn://192.168.2.100/ code
[root@web2 ~]# cd /tmp
[root@web2 ~]# svn --username harry --password 123456 co svn://192.168.2.100/ code
[root@web1 ~]# cd code
[root@web2 ~]# cd code
- harry和tom修改不同的文件
[root@web1 mycode]# sed -i "3a ###tom modify#####" tmp.mount #在第三行之后输入###tom modify#####
[root@web1 mycode]# svn ci -m "has modified"
[root@web2 mycode]# sed -i "3a ###harry modify#####" umount.target
[root@web2 mycode]# svn ci -m "has modified"
[root@web2 mycode]# svn update #得到web1修改tmp.mount的结果
[root@web1 mycode]# svn update #得到web2修改umount.target的结果
3)harry和tom修改相同文件的不同行
[root@srv5 ~]# cd harry
[root@web1 mycode]# sed -i "3a ###tom modify#####" user.slice
[root@web1 mycode]# svn ci -m "modified"
[root@web2 mycode]# sed -i "6a ###harry modify#####" user.slice
[root@web2 mycode]# svn ci -m "modified" //提交失败
Sending svnserve
Transmitting file data .svn: Commit failed (details follow):
svn: File '/user.slice' is out of date(过期)
[root@web2 mycode]# svn update //提示失败后,先更新再提交即可
[root@web2 mycode]# svn ci -m "modified" //提交成功
Sending user.slice
Transmitting file data .
- harry和tom修改相同文件的相同行:人为解决,先人工后智能
[root@web1 mycode]# sed -i '1c [UNIT]' tuned.service
[root@web1 mycode]# svn ci -m "modified"
[root@web2 mycode]# sed -i '1c [unit]' tuned.service
[root@web2 mycode]# svn ci -m "modified"
Sending tuned.service
Transmitting file data .svn: Commit failed (details follow):
svn: File '/tuned.service' is out of date(过期)
[root@web2 mycode]# svn update //出现冲突,需要解决
Conflict(冲突) discovered in 'tuned.service'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict(我的版本), (tc) theirs-conflict,(他的版本)
(s) show all options:p //选择先标记p,p是推迟解决,随后解决
[root@web2 mycode]# ls tun*
tuned.service(差异对比) tuned.service.mine(我认为的版本) tuned.service.r10(他的版本) tuned.service.r9(我和他修改之前的版本)
[root@web2 mycode]# mv tuned.service.mine tuned.service #把我的留下,
[root@web2 mycode]# rm -rf tuned.service.r10 tuned.service.r9
[root@web2 mycode]# svn ci -m "modified" //解决冲突,最终留下某人的版本
使用dump指令备份版本库数据
svnadmin dump /var/svn/project > project.bak //备份所有版本
svnadmin create /var/svn/project2 //新建空仓库
svnadmin load /var/svn/project2 < project.bak //还原到空仓库
一般在实际环境中,每周五都作一次备份
标签:svn,code,service,web2,mycode,root From: https://www.cnblogs.com/lixunblogs/p/18167136