svn的版本问题

这两天遇到个关于svn版本的问题,折腾了比较久,后来总算解决了,并借此熟悉了几个类unix系统下的命令和工具的使用,现特意记录下来,算是经验的总结,也便于下次有需要的时候容易找到。

先来描述一下我遇到的是什么问题,我的系统是os x ei capitan 10.11.6 ,机子上同时搭建了ios和android的开发环境,本地的svn版本号是1.9.4,在将系统升级到10.11.6之前,我不记得svn的版本号是不是1.9.4了,但是基本可以肯定也是高于1.7的(mac os系统自带了svn)。但是升级mac os后,进入到我的android工程代码里,执行svn update后,总是提示我输入svn的账号和密码;我确定我的密码并没有错误,并且后来试过执行svn list ,svn log,svn export这些命令都是正常的,唯一不正常的就是svn update 和svn checkout; 跟负责公司svn服务器的同事沟通了一下,他告诉我很可能是svn客户端版本号的兼容问题,建议我将svn的客户端版本号降低到1.7试试(由于某些原因,公司的svn服务器多年来一直没有升级过,还是十多年前安装的版本1.1.4) 接下来就是我为了试试将svn的版本号降低到1.7所进行的折腾,为方便查看,下面将按事情的先后顺序分别记录所遇到的问题和解决办法。

1、我首先想到通过brew来安装特定版的svn(brew是一个方便在mac os上安装和管理软件的工具,关于brew的使用这里不再介绍,请自行搜索相关资料),但是发现os x ei capitan上并不支持安装v1.7的版本,详情如下:
admindeiMac-42:~ admin$ brew search subversion
homebrew/versions/subversion17 subversion ✔
homebrew/versions/subversion18 ✔
admindeiMac-42:~ admin$ brew install homebrew/versions/subversion17
Updating Homebrew…
==> Installing subversion17 from homebrew/versions
subversion17: This formula either does not compile or function as expected on macOS
versions newer than Yosemite due to an upstream incompatibility.
Error: An unsatisfied requirement failed this build.

2、于是尝试通过源码安装svn1.7,类unix下通过源码安装软件无非3个步骤:configure,make, make install,其中configure是重点,不少软件的安装都需要一些正确的配置项信息才能成功安装。到svn的官方网站上下载1.7的代码并解压,进入该目录下执行
./configure –prefix=/usr/local –with-apr=/usr/local/opt/apr –with-apr-util=/usr/local/opt/apr-util –with-neon=/usr/local –with-ssl –without-sasl
具体解析下各配置项的作用,
–prefix是用来指定安装的目标路径,默认就是/usr/local
–with-apr和–with-apr-util用来指定要依赖的软件模块apr和apr-util,
关于apr和apr-utl是什么东西,请参考某网友的解释:“apr-util和apr都是为上层应用提供的运行库。为没有stl库的C语言提供了一些数据结构和操作系统封装接口。显然apache的许多软件都是以apr/apr-util为基础库进行开发的。apr-util只是在apr的基础上提供了更多的数据结构和操作系统封装接口而已”
如果你的机子上还没有安装apr和apr-util,可直接通过brew安装,比较简单;
–with-neon neon的作用简单来说就是可以通过http和https来访问你的svn代码库,如果你成功安装了svn,通过svn –version来查看所安装的svn的信息,你可以看到下面的信息:
The following repository access (RA) modules are available:

  • ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
    • handles ‘http’ scheme
  • ra_svn : Module for accessing a repository using the svn network protocol.
    • handles ‘svn’ scheme
  • ra_local : Module for accessing a repository on local disk.
    • handles ‘file’ scheme

说明neon这模块已经加到svn里面去了,如果没有neon,是不能通过http协议访问代码库的
我在配置这neon到svn里面的时候,也遇到了一个版本的问题,这个根据错误提示安装特定版本的neon,并在–with-neon里正确指定其路径就可以
–with-ssl 和–without-sasl貌似不是必须,没有亲自验证。
通过上面这个方法成功安装了svn1.7, svn update 或svn checkout的时候却提示
svn: E200029: Couldn’t perform atomic initialization
svn: E200030: SQLite compiled for 3.14.0, but running with 3.8.10.2
说明svn是依赖sqlite的,并且当前的sqlite版本似乎并不适合svn1.7使用。于是上sqlite的官网下载了sqlite 3.8.10.2的源码,编译和安装,完成安装sqlite 3.8.10.2后,再重新安装svn1.7,在configure里增加一个配置项 –with-sqlite=/usr/local
所有信息配置正确,然后make && make install 就可以了

3、补充一个关于环境变量的知识,之前自己并没有很好地理解这个东西,造成了许多不必要的折腾;我现在对环境变量的理解是,环境变量是由一些路径组成的,路径与路径之间用冒号分隔,放在前面的那些路径优先级会高于放在后面的,例如/usr/local/bin的优先级比/usr/bin的优先级高,系统会优先看看/usr/local/bin下面有没有该软件的可执行文件,有就执行该路径下的可执行文件,没有则继续查找环境变量里的下一个路径;可以在命令行下通过echo $PATH查看当前用户的环境变量,例如我的就是:
admindeiMac-42:~ admin$ echo $PATH
/usr/local/bin/svn:/Users/admin/.rvm/gems/ruby-2.2.2/bin:/Users/admin/.rvm/gems/ruby-2.2.2@global/bin:/Users/admin/.rvm/rubies/ruby-2.2.2/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/admin/.rvm/bin
以mac os里的svn或sqlite为例子,mac os本身已经安装了svn和sqlite,放在/usr/bin下面,而自己通过brew或源码安装的一般都位于/usr/local下面。这样就是说,一台机子上可以安装不同版本的svn或sqlite,当安装软件需要处理依赖关系的时候,正确指定所依赖的软件的位置就比较重要了;

4、关于android studio和xcode 里所用的是哪个版本的svn的问题,android studio可以在prefrence – version control – Subversion – General 里的Use command line client里指定svn的路径 例如/usr/local/bin/svn;
而Xcode则是依赖一个自己专用的svn模块,位置在/Applications/Xcode.app/Contents/Developer/usr/bin

    原文作者:大浪捉鱼
    原文地址: https://www.jianshu.com/p/13a6f95568b7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞