SVN的使用

1. 常用命令

基本使用命令:

svn checkout 代码URL # 简写为 svn co 代码URL
# 如果检出需要用户名密码,而用户名和本机不一致,那么用'--username 用户名'来制定
svn update 代码URL # 简写为svn up 代码URL
svn info # 显示当前svn的详细信息,包括URL和最近更新等
svn status # 简写为svn st 显示当前svn有修改的文件

添加或删除文件:

svn add 文件名
svn delete 文件名  # 如果加上 --keep-local 可以保持本地文件不被删除

忽略文件:有些文件例如像eclipse生成的.project .settings等文件或文件夹是不需要上传到svn上的:

svn propset svn:ignore ".classpath
.project
.settings
.idea
*.iml
target
bin
build" .   # 对于多个文件的,可以这样来,也可以-F 制定一个放ignore内容的文件

vue或前端的忽略写法:

svn propset svn:ignore ".idea
.nuxt
_generate_entry
node_modules
npm-debug.log
dist
build
*.iml
" .

关于提交的相关命令:

svn commit -m '描述信息' # 提交所有修改的文件,包括修改、新增、删除
svn commit 制定文件 -m '描述信息' # 只提交指定的文件

还原操作相关:

svn revert -R .   # 还原所有文件,但不会删除已经添加的新文件
# 等价于 svn revert --depth=infinity .
# 也可以单独还原某个文件 svn revert 文件名

这个revert也可以还原添加add进去的文件的。

分支相关操作

关于svn的特殊符号: 对于一个已经检出的svn目录,对于URL的操作,都可以用caret(^)符号表示svn的根目录,例如^/trunk表示主干。

创建新分支:

svn cp -m "test" ^/trunk ^/branches_test # 注意,windows下的^符号可能没法解析,linux的可以

创建分支后,新分支的文件,本质上是完全和原分支独立的,就是个复制关系。

删除分支:

svn rm ^/branches_test

移动分支:

svn move 分支源路径 分支目的路径

如果分支的名称包含了@,移动的时候可能会出现a peg revision is not allowed here的错误,此时只需要在分支的最后面加上一个@即可。

合并相关操作

分支合并主干的更新:在分支里面执行

svn merge ^/trunk  # 这个名称自己定,不一定是根目录下的trunk

设计上,分支合并主干的更新是可以重复进行的。如果合并起来有冲突,是由分支自己来解决。

主干合并分支:在主干分支执行

svn merge ^/branches/xxx  # 分支路径,svn1.8以后会自动判断--reintegrate

如果当前URL_A要合并的URL_B是不同的祖先关系,那么执行这行命令会出现“必须有祖先关系”的错误,那么推荐使用merge diff的方式:

svn merge -r 要合并的URL开始版本:要合并的URL结束版本 另外一个主干或分支URL # 例如: svn merge -r 22:55 ^/branches/xxx

测试一下分支的合并结果 :merge命令加上--dry-run,merge只是预览,不会实际发生。

如果合并有冲突,要强制提交冲突的文件,(那么删除掉冲突的文件后,这一步需要吗?),强行:

svn resolved *
svn commit -m ""

注:合并这里有一种情况,就是一个分支已经合并过另一个分支了,然后后面又想重新再合并一次,此时TortoiseSVN看下svn的Properties里面的mergeinfo有没有要合并的分支的信息,如果有的话,编辑删除掉就好了。

实际分支开发的方式

项目会保持一个主干分支,线上只发布trunk分支。开发分支从主干分支拉出来。当主干分支有更新时,开发分支要合并主干时,应该先从主干拉出一个新分支,然后把旧分支合并到新分支上,同时解决冲突,新的分支就是合并后的开发分支了。这个新分支就可以合并到主干上了。

解决拉取代码中有中文名称的问题

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

2. 可视化软件

2.1. tortoiseSVN

老牌的svn可视化客户端,只有windows版本,非常好用。下载地址

在windows下,tortoiseSVN可视化的工具非常好用,以至于我常常要去svn的目录右键点击来查看Log或看RepoBrowser,我们可以使用命令更好地做到:

TortoiseProc /command:repobrowser /path:"E:\code\svn_code"
TortoiseProc /command:log /path:"E:\code\svn_code"

更多的command命令参考这篇博客

2.2 windows下svn命令行

这里下载Win32Svn安装即可。

2.3. eclipse插件

这里下载得到离线安装包site-1.10.*.zip,然后通过eclipse离线方式安装,安装时选择“Subclipse”和“SVNKit”两个,去掉勾选“Contact all update sites during install to find required software”,会安装得快一些。

安装之后,在Eclipse的Preferences中搜索SVN-控制台,勾选上当命令运行时,自动显示SVN控制台

3. 权限控制

发现一个svn很坑爹的权限设置bug:当分组和用户名的名称相同时,svn copy目录会出现Access denied的错误。

4. 低版本的svn问题

linux下低版本的svn,例如默认的1.6.11版本在merge分支时,错误地判断出了文件冲突。

linux下推荐svn更新到1.8.x最新版本或1.9.x最新版本。

对于centos而言,根据不同版本,把下面对应CentOS版本的配置添加到/etc/yum.repos.d/wandisco-svn.repo文件中:

CentOS/RHEL 7:

[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/
enabled=1
gpgcheck=0

CentOS/RHEL 6:

[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/6/svn-1.9/RPMS/$basearch/
enabled=1
gpgcheck=0

CentOS/RHEL 5:

[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/5/svn-1.9/RPMS/$basearch/
enabled=1
gpgcheck=0

然后执行:

yum clean all
yum remove subversion
yum install epel-release
yum install subversion

对于debian安装svn:apt install subversion,该命令同时会安装上svn服务器svnserver

5. CentOS安装SVN Server

下面操作参考这篇文章。除了安装上面的新版subversion外,还需要安装的软件:

yum install httpd httpd-devel mod_dav_svn mod_auth_mysql

验证已经安装server:

svnserve --version

创建代码库(repositories的名称可以换成是项目名称):

mkdir -p /opt/svn/repositories
svnadmin create /opt/svn/repositories

设置用户和密码(增加一行就是一个用户和密码):

cd /opt/svn/repositories/conf
vi passwd

配置用户访问目录(参考authz文件说明,[/]表示根目录):

vi authz

配置不允许匿名访问及权限访问控制,(不要只增加一行anon-access=none),编辑svnserve.conf,增加一下内容:

[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db=passwd
#访问控制文件
authz-db=authz
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=/opt/svn/repositories

配置防火墙:

vi /etc/sysconfig/iptables
# 增加一行 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
service iptables restart

启动svn:

svnserve -d -r /opt/svn/repositories

测试checkout:

svn co svn://IP地址/

停止svn:

killall svnserve

关于svn迁移:SVN从Windows迁移至Linux。linux迁移linux,如果系统和svnserver版本一致的话,只需要把整个repo复制过去即可。如果系统和版本跨越大,参考这篇文章

关于一台机器上运行多个svn repo,只需要把多个repo放在同一个目录下,然后svnserver启动时选择父目录,然后svn链接url就都加上各个repo的子目录名称。

文档更新时间: 2018-11-10 22:46   作者:nick