个人感觉,svn是轻量级代码管理工具,适合3-5人小团队使用,冲突少,提交和下载也够方便。
不过,网上关于svn使用的教程,大多数是windows系统的图形化管理工具TortoiseSVN,而linux系统svn的常用指令却七零八碎。
这里对自己在ubuntu中使用svn的常用命令做一个简单总结,便于自己和别人查阅。
1.安装svn
sudo apt install subversion
2.下载源码
假如svn服务器地址为http://127.0.0.1:23001/svn,我们要下载test目录,则有两种方式
- 指定下载目录
svn checkout http://127.0.0.1:23001/svn/test /home/test
- 不指定下载目录
svn checkout http://127.0.0.1:23001/svn/test
两者的区别就是,指定svn下载目录时,会在/home/test目录,下载svn服务器的test目录中所有文件,但不再创建根test目录。
如不指定下载目录,那会在当前目录创建test目录,并下载svn服务器的test目录中所有文件。
3.下载目录介绍
下载test目录后,本地test目录是服务器test目录管理代码的完全拷贝。
除此之外,还会创建一个隐藏的.svn目录,用于管理本地代码同步问题,这个目录很重要,但是一般我们都不会直接使用。
后续如复制本地test目录时,如不删掉.svn目录,在新拷贝备份中,svn代码管理命令是仍然可用的。
4.svn基本使用命令
svn help // 列出svn的所有命令
svn st help //列出svn的st命令介绍
svn info // 列出本地svn目录的基本信息,我一般用来查svn服务器地址,查看当前版本信息
svn up // 下载svn服务器更新代码
svn st // 查看基于本地代码版本的当前修改内容
5.比较本地文件与服务器差异
svn diff //列出所有不同文件的内容差异,打印会比较多,请注意使用大屏幕
svn diff test.c //列出test.c与服务器之间的内容差异
6.增加本地文件,并准备提交服务器
svn add test.c //将test.c文件增加到本地svn
svn add folder //将folder目录及里面所有文件都add到本地svn
这里需要注意:svn add时,*.so *.bin 等文件默认是被忽略,解决办法有两个:
1) 每次添加文件的时候使用如下命令:
svn add --no-ignore folder
2)编辑以下任一文件(linux的svn客户端的配置文件)
/etc/subversion/config (针对服务器所有用户有效)
~/.subversion/config (对当前用户有效,会覆盖上面“/etc/subversion/config”这个配置,而不是在上面原有的配置基础上增加)
将文件中包含“global-ignores = ”的行,取消注释,并把这个“=”之后的字符全部删除。
要特别注意 global-ignores 前面不要留空格,紧挨着最前面就可以了,否则svn add的时候会报错:
svn: /etc/subversion/config:103: Option expected
7.提交本地修改到服务器
svn commit -m "why commit" // 提交所有本地与服务器差异的文件
svn commit -m "why commit" test.c //仅提交test.c修改的文件,可以一次提交多个更改文件 不同文件间用空格分开
8.冲突时,放弃本地修改
svn revert -R . //放弃本地所有修改文件,用服务器最新版本覆盖,注意-R最后的空格和点不可忽略
svn revert test.c //放弃本地test.c文件中的修改
9.svn up后冲突解决办法
在本地目录,会列出这样几个文件:
test.c //本地代码合并服务器最新版本(本地代码包含已修改的部分)
test.c.mine //本地代码(包含已修改的部分)
test.c.r001 //本地代码修改前的基线版本
test.c.r002 //服务器当前最新版本
可以查看test.c,确认差异点;
想直接覆盖服务器最新版本,直接把其他文件全部删除,将test.c.r002改名为test.c即可。
想直接用本地的提交,删除其他文件,将test.c.mine改名为test.c即可
10.修改svn服务器地址
svn sw --relocate https://120.0.0.1:23001/svn/test https://127.0.0.1:23001/svn/test
第一个地址为旧地址,第二个地址为新地址,执行后,会提示是否永久替代,选择是,并根据提示,填写相应的账号密码即可。
11.解决本地版本号和服务器版本号一致,但本地实际代码落后于服务器代码的问题
使用svn up指令更新了本地代码,显示版本号为1630,服务器最新版本也是1630;
但是服务器1630版本,目录中仅有三个文件,本地代码中,却显示有之前删除掉的10个废弃文件;
尝试删除废弃的10个文件或者把整个目录都删掉,重新update,仍然会下载废弃的10个文件;
svn list查看,显示只管理着1630的三个新文件;
用svn revert -R .还原整个工程,重新svn up,仍然会下载废弃的10个文件。
解决办法:
将项目回滚到之前的一个版本,比如1628版本 ,然后再up到最新版本,问题解决
svn up -r 1628
svn up
可能出现冲突等问题,见招拆招即可,svn up不会再下载删掉的10个文件