教程:在Linux、windows7上安装和使用svn(包括修改svn文件提交时间、提交人、提交信息)(修改svn提交日志)(***)
以下是我整理的svn使用方法,特别是修改svn文件提交时间、提交人、提交信息这块。很少有人去实践,所以我特地整理一下。
参考:SVN和Git对比梳理
1 执行以下命令
sudo apt-get update
sudo apt-get install subversion
svn #安装是否成功
-----------------------------------------------------------
2 创建SVN版本库
2.1
创建目录/opt/svn :mkdir /opt/svn/
创建svn下的repository文件夹:mkdir /opt/svn/repository
更改repository的权限: sudo chmod -R 777 /opt/svn/repository/
创建版本库: sudo svnadmin create /opt/svn/repository/,
完成后会在repository文件夹下生成以下文件:
然后对db文件夹进行权限设置:sudo chmod -R 777 /opt/svn/repository/db/
2.2
设置访问权限:需要对conf文件夹下的文件进行修改
①修改配置文件conf/svnserve.conf
root@ceph2:/opt/svn/repository/conf# nano svnserve.conf
#匿名用户可读
anon-access = read(可改成none,即不可读)
#权限用户可写
auth-access = write
#密码文件为passwd
password-db = passwd
#权限文件为authz
authz-db = authz
(去掉前面的#,并且顶格,不然可能会报错)
②添加访问用户conf/passwd
root@ceph2:/opt/svn/repository/conf# nano passwd
③设置用户权限conf/authz
root@ceph2:/opt/svn/repository/conf# nano authz
admin = dyg //用户dyg属于admin权限组
@admin = rw //admin权限组的权限是读和写
* = rw //所有的组都具有读权限和写权限
-----------------------------------------------------------
3 测试SVN服务器
①启动服务器 svnserve -d -r /opt/svn/ #(-d:表示在后台运行 ,-r:指定服务器的根目录)
查看svnserve是否已经运行:ps aux | grep svnserve
(此时服务器已经在后台运行了,可通过“svn://服务器ip/repository”从svn客户端访问服务器了)
如果需要关闭服务器,可以用命令:killall svnserve
此时svn的服务端安装完成!
3. windows7上安装和使用svn
1. Windows7环境下安装SVN服务端
下载地址 https://www.visualsvn.com/server/download/ 按照自己的系统下载对应版本。
下载后点击安装,一直选择默认选项到以下界面:
安装成功后弹出界面:
管理界面中,有Repositories,Users,Groups和Jobs四个目录
Repositories:仓库路径
Users:用户列表
Groups:组列表
Jobs:任务表
新建一个仓库,仓库名为5000,鼠标放在仓库名称上,右键点击 Properties,可以看到该仓库的属性信息,人员信息配置在Security标签页
此后可新建用户并设置其权限,如创建用户dyg,密码为12345678,权限为可读可写:
此时在目录“E:\svn_server\Repositories”即可找到5000仓库。该仓库的服务端地址为:https://dengyungao/svn/5000。
可在web页面查看该仓库的详情,选择如下菜单:
效果:
2. Windows7环境下安装SVN客户端
下载地址: http://tortoisesvn.net/downloads.html,根据操作系统下载相应版本(TortoiseSVN)。
安装教程:https://jingyan.baidu.com/article/19020a0a27f90c529c284259.html(一直默认即可)
此时表示安装成功
3. 拉取仓库代码到本地目录
创建本地目录:E:\5000_svn
在该目录中鼠标右键,选择svn菜单:
4. 本地上传代码到服务端的仓库
本地目录新建文件:
鼠标邮件选择菜单项:
在服务端的仓库中查看提交的文件:
查看提交记录:
5. 其他操作
1. 将仓库最新信息更新到本地目录
当团队其他成员更新远程仓库内容时,可将最新内容更新到自己的本地目录中,右键选择菜单项:
2. SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤
(参考:https://blog.csdn.net/vbirdbest/article/details/51122637)
3. 配置通过ip地址访问svn
4. 代码冲突解决
解决代码冲突可以结合以下几种方式进行:
第一种,文件锁定
SVN默认情况下,所有的文件都没有锁定,只要有提交权限的人都可以在任何时候提交任何的文件。其他人会定时更新他们的工作目录,在库中的改变的东西都会与本地合并。如果你对一个文件获得锁定,那么只有你可以提交这个文件。其他用户的提交都会被拒绝,直到你释放了这个锁。
获取锁:选择你想要获取锁定的文件/文件夹,然后右键菜单点击TortoiseSVN---->Get lock,将会弹出锁定窗口:
一个良好的习惯是每次获取锁定时,在红色标注位置输入获取锁的原因。
释放锁:
有两种情况会释放锁:
1、手动选择你想要释放锁定的文件,然后右键菜单点击TortoiseSVN Release lock;
2、TortoiseSVN为了确保你不会忘记释放锁,在每次”SVN commit“提交时,总是会显示锁定的文件,并总是默认被选中。如果你继续提交,则文件的锁就被自动移除。如果你不希望释放文件的锁,就必须取消选中它。
问题是什么?
如果实际操作过,使用过TortoiseSVN 的 Get lock来加锁,就会发现并不如你所预期的,对文件实现了严格加锁,本篇也就不必要写了。问题在哪?使用TortoiseSVN 的 Get lock锁定文件后,其他用户并不知道你对这个文件已经锁定,即时他们签出最新的版本,依然能够对文件在本地进行修改,文件依然是可读写的状态。
这是一个在其他成员电脑上已经Get lock的文件,可以看到与其他文件在状态上没有任何区别:
这样其实是没有意义的,别人依然会对你锁定的文件进行修改,只有当他们在签入时才会发现文件已经被锁定:
这种加锁操作下,团队成员需要定期的检查文件的锁定状态,可以使用TortoiseSVN-----> check for modifications:
3、更好的办法:使用属性,将文件设置为只读;
之所以存在被锁定后其他成员依然可以在本地修改,是因为SVN所采取的是乐观加锁的策略。如果我们想对某个文件或某个目录采取严格加锁策略,更明确的说是:所有文件默认为只读,在文件修改前需要先获取锁,只有其他人不拥有锁时才可以锁定文件并修改。要实现严格加锁,就需要使用SVN的svn:needs-lock属性。
在想要采取严格加锁的文件或目录上鼠标右键,使用TortoiseSVN----> Properties属性菜单,点击News新建属性,选择Needs-lock:
当设置了svn:needs-lock属性后,实际上对文件就采取严格加锁策略,对文件的任何修改都必须先使用TortoiseSVN 的 Get lock锁定文件,然后才能进行修改。
4、关于锁的建议
对于项目中的二进制文件,如图片、声音、动态库等,可以在目录上统一设置svn:needs-lock属性,避免在这些文件上产生冲突,浪费解决冲突的时间。当然,普通文件,也可以设置为只读属性,并且在目录上统一设置svn:needs-lock属性。这样就可以保证同一时刻只有自己能修改文件。修改之前,需要GetLock锁定文件。
第二种,使用svn自身工具
根据前面陈述可知,针对已有的仓库”file:///E:/5000_svn_formal“已有一个本地目录”E:\5000_svn_code“,现在再创建一个本地目录”E:\5000_svn_code_other“,并将仓库的内容check out到该目录。
然后我们在两个本地目录的子目录trunk中都增加一个文件phone.txt。起初内容相同。
现在先修改E:\5000_svn_code中的phone.txt并提交到仓库,phone.txt的内容为:
11111111222
11123491238
11123908924
11154981951
11161573208
11161799306
11167377764
11169555124
11171083845
11181992716
11191890139
123456
12345678900
12345678901
12345678902
12345678903
12345678908
12345678909
12345678912
12345678922
12345678933
12345679902
45678912315
dd
ff
再修改E:\5000_svn_code_other中的phone.txt,两者修改内容不同,phone.txt的内容为:
11111111222
11123491238
11123908924
11154981951
11161573208
11161799306
11167377764
11169555124
11171083845
11181992716
11191890139
123456
12345678900
12345678901
12345678902
12345678903
12345678908
12345678909
12345678912
12345678922
12345678933
12345679902
aa
zz
此时提交到仓库时就会报错。
在目录E:\5000_svn_code_other\trunk执行”SVN update“同样会报错,
此时选中冲突文件,右键如下操作:
选项解释:
Edit confilicts:修改冲突,可以对冲突的行进行内容选择,后面我们详细说。
Mark as resolved:直接标记为已解决,这样会删除.mine、.r1、.r2这些文件,但这只是标记,如果你直接标记为解决,实际上文件还是冲突的,只是状态修复了。
Resolve conflict using 'theirs':使用其他人提交的内容来覆盖我修改的内容,以此解决冲突。如果你的修改不需要提交,你可以方便的选择这个。
Resolve conflict using 'mine':使用我本地的版本覆盖其他人提交的版本,以此解决冲突。如果其他人提交的代码没什么用,你可以直接使用这个来解决。
下面我们详细讲解下Edit confilicts这个选项。点击该选项打开界面:
上图的左边A展示的是上个版本的变化,中间B .mine是我们自己本地修改的版本,右边C是其他人员修改的版本。最下面是我们想要的版本。假设我们需要24行保留为我本地(B)的修改,25行使用其他人(C)提交的。则:
最终效果为:
此时可以保存所有内容,也可以直接删除不想要的内容。最后按ctrl+s保存并退出。此时再进入我们本地目录,执行下面操作,默认冲突解决!
最后将本地目录内容更新到仓库,其他人就可以拉取最新的项目了。
5. 修改svn文件提交时间、提交者、提交日志内容
1)svn server的修改
server端仓库地址:
进入“hooks”目录,将文件“pre-revprop-change.tmpl”文件名修改为“pre-revprop-change”,
该文件内容修改为:
#!/bin/sh
exit 0
再修改文件“pre-revprop-change.cmd”的内容为:
exit 0
最后修改仓库的钩子文件。
修改上述文件的内容为:
2)修改文件提交时间
拉取仓库代码到本地
比如修改文件“test.txt”的提交者、提交时间以及提交描述:
查看原提交信息
修改提交信息
最后,本地仓库update一下,并重启svn服务端和客户端(提示:最好直接重启服务端和客户端的电脑),我修改后的效果: