Linux下搭建高效的SVN
第一种安装方式:
svn下载:http://archive.apache.org/dist/subversion/
需要的包
yum install gcc gcc-c++
yum install expat-devel
yum install openssl-devel
http://labs.renren.com/apache-mirror//httpd/httpd-2.2.22.tar.gz //最好用2.2版本
http://subversion.tigris.org/downloads/subversion-1.6.18.tar.gz
http://subversion.tigris.org/downloads/subversion-deps-1.6.18.tar.gz
subversion-1.6.18.tar.gz 、subversion-deps-1.6.18.tar.gz 这两个文件版本要是一样的,也要放在一个目录下,分别解压这两个文件。
解压这三个文件
tar zxvf httpd-2.2.22.tar.gz
tar zxvf subversion-1.6.18.tar.gz
tar zxvf subversion-deps-1.6.18.tar.gz
注:解压 subversion-deps-1.6.18.tar.gz 时, 会把这个文件解压到subversion-1.6.18文件夹下
下载地址:
httpd-2.2.22.tar.gz 下载地址:http://download.csdn.net/detail/yelang_110/8529403
subversion-1.6.18.tar.gz 下载地址:http://download.csdn.net/detail/yelang_110/8534379
subversion-deps-1.6.18.tar.gz 下载地址:http://download.csdn.net/detail/yelang_110/8534393
安装httpd
[root@localhost ~]# cd httpd-2.2.22
[root@localhost ~]# ./configure --enable-dav --enable-so --prefix=/usr/local/httpd
[root@localhost ~]# make && make install
[root@localhost ~]# /usr/local/httpd/bin/httpd -l //查看下是不是有 mod_dav.c 、mod_so.c 两个模块
安装subversion 并关联httpd
[root@localhost ~]# ./configure --with-apxs2=/usr/local/httpd/bin/apxs --prefix=/usr/local/svn
[root@localhost ~]# make && make install
注:这里出错:
checking for xml2-config… no
configure: error: no XML parser was found: expat or libxml 2.x required
[root@localhost ~]#yum install expat-devel
checking for openssl/opensslv.h... no
configure: error: We require OpenSSL; try --with-openssl
[root@localhost ~]#yum install openssl-devel
[root@localhost ~]# ls /usr/local/httpd/modules/
mod_authz_svn.so mod_dav_svn.so //这里会多这两个文件
[root@localhost ~]# vim /usr/local/httpd/conf/httpd.conf
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so //httpd配置文件里也会多这两行配置
[root@localhost ~]# /usr/local/svn/bin/svnadmin create /usr/local/repos //
[root@localhost ~]# chown -R daemon:daemon /usr/local/repos/
[root@localhost ~]# chmod -R 700 /usr/local/repos/
//修改配置文件 最后一行添加
[root@localhost ~]# vim /usr/local/httpd/conf/httpd.conf
<Location /repos>
DAV svn
SVNPath /usr/local/repos
</Location>
启动httpd
[root@bogon bin]# ./apachectl start
httpd: apr_sockaddr_info_get() failed for bogon
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
如果报这个错就修改hosts
vim /etc/hosts
把bogon主机名(hostname查询主机名)添加到 127.0.0.1 后面就不报错了
测试
svn认证文章:
http://topinking.iteye.com/blog/342831
认证选项
1、基本 HTTP 认证
最简单的客户端认证方式是通过 HTTP 基本认证机制,简单的使用用户名和密码来验证一个用户的身份。Apache提供了一个 htpasswd 工具来管理一个用户文件,这个文件包含用户名和加密后的密码,这些就是你希望赋予 Subversion 特别权限的用户。htpasswd 可以在 Apache 的 bin 安装目录下找到。具体使用方法如下
创建用户文件:
htpasswd -c -m /usr/local/httpd/conf/passwordfile username
添加新用户(-m 表示以MD5加密密码):
htpasswd [-m] /usr/local/httpd/conf/passwordfile Newusername
更改用户密码:
htpasswd [-m] /usr/local/httpd/conf/passwordfile username
删除用户(要用大写的 D ):
htpasswd –D /usr/local/httpd/conf/passwordfile username
接下来修改 httpd.conf,在 Location 标签中加入如下内容:
<Location /repos>
DAV svn
SVNPath /usr/local/repos
AuthType Basic
AuthName "svn repos"
AuthUserFile /usr/local/httpd/conf/passwordfile
Require valid-user
</Location>
说明:
AuthType Basic:启用基本的验证,比如用户名/密码对。
AuthName "svn repos":当一个认证对话框弹出时,出现在认证对话框中的信息。(最好用英文,TortoiseSVN 不支持中文,安装语言包除外。)
AuthUserFile E:/usr/Apache2.2/bin/passwd:指定E:\usr\Apache2.2\bin\passwd为用户文件,用来验证用户的用户名及密码。
Require valid-user:限定用户只有输入正确的用户名及密码后才能访问这个路径, Require user abc sli" 将只有用户文件中的 abc 和 sli 两个文件夹可以访问该版本库。
如果想要指定多个版本库,可以用多个 Location 标签,也可以使用 SVNParentPath 代替 SVNPath,例如在 e:\svn 下有多个版本库 repos1,repos2 等等,用如下方式指定:
<Location /repository>
DAV svn
SVNParentPath e:/svn
</Location>
“SVNParentPath e:/svn ” 表示 e:\svn 下的每个子目录都是一个版本库。可以通过 http://服务器IP/repository/repos1,http://服务器IP/repository/repos2 来访问。
有的时候也许不需要这样严格的访问控制,例如大多数开源项目允许匿名的读取操作,而只有认证用户才允许写操作。为了实现更为细致的权限认证,可以使用 Limit 和 LimitExcept 标签。例如:
<LimitExcept GET PROPFIND OPTIONS REPORT>
require valid-user
</LimitExcept>
以上配置将使匿名用户有读取权限,而限制只有 passwd 中配置的用户可以使用写操作。
2、严格的权限控制(本人整理)
1.新建版本库
[root@localhost ~]# /usr/local/svn/bin/svnadmin create /usr/local/repos //
[root@localhost ~]# chown -R daemon:daemon /usr/local/repos/
[root@localhost ~]# chmod -R 700 /usr/local/repos/
删除版本库自带的密码文件,权限控制文件
[root@localhost ~]# rm -fr /alidata1/repos/conf
2.httpd.conf,在 Location 标签中加入如下内容:
<Location /repos>
DAV svn
SVNPath /alidata1/repos
AuthType Basic
AuthName "svn repos"
AuthUserFile /alidata1/httpd/conf/passwordfile
AuthzSVNAccessFile /alidata1/httpd/conf/authz
Require valid-user
</Location>
AuthzSVNAccessFile 就是 /alidata1/repos 库的权限控制文件,AuthUserFile 是密码控制文件。
3.创建用户名跟密码
创建用户文件:
htpasswd -c -m /usr/local/httpd/conf/passwordfile username
添加新用户(-m 表示以MD5加密密码):
htpasswd [-m] /usr/local/httpd/conf/passwordfile Newusername
4.修改权限控制文件
[groups]
@t1=a,b,c
@t2=e,d
[/] //必须添加一条根目录,并且所有用户都能读取,不然用户登录不了
*=r
[/aa]
@t1=rw //对根目录下面的aa文件夹,a,b,c 这三个用户可以读写
@t2= //注意后面是空(不写任何数据),表示e,d 这两个用户对aa文件夹没有任何权限,也不能看见aa文件夹
3、用 mod_authz_svn 进行目录访问控制
首先需要让 Apache 将 mod_authz_svn 模块加载进来。在 Subversion 的安装目录中找到 mod_auth_svn 模块,将其拷贝到 Apache 安装目录的 modules 子目录下。修改 httpd.conf 文件,添加:
LoadModule authz_svn_module modules/mod_authz_svn.so
现在可以在 Location 标签中使用 authz 的功能了。一个基本的 authz 配置如下:
<Location /repository>
DAV svn
SVNParentPath e:/svn
# our access control policy
AuthzSVNAccessFile E:/usr/Apache2.2/bin/accesspolicy.conf
# try anonymous access first, resort to real
# authentication if necessary.
Satisfy Any
Require valid-user
# how to authenticate a user
AuthType Basic
AuthName "Subversion repository"
AuthUserFile E:/usr/Apache2.2/bin/passwd
</Location>
AuthzSVNAccessFile 指向的是 authz 的策略文件,详细的权限控制可以在这个策略文件中指定。访问文件 accesspolicy.conf 的语法与svnserve.conf和 Apache 的配置文件非常相似,以(#)开头的行会被忽略;在它的简单形式里,每一小节命名一个版本库和一个里面的路径;认证用户名是在每个小节中的选项名;每个选项的值描述了用户访问版本库的级别:r(只读)或者rw(读写),如果用户没有提到或者值留空,访问是不允许的; * 表示所有用户,用它控制匿名用户的访问权限;@符号区分组和用户。如:
[groups]
committers = paulex, richard
developers = jimmy, michel, spark, sean
[/]
* = r
@committers = rw
[/branches/dev]
@developers = rw
[/tags]
tony = rw
[/private]
* =
@committers= r
使用 SVNParentPath 代替 SVNPath 来指定多个版本库的父目录时,其中所有的版本库都将按照这个策略文件配置。例如上例中 tony 将对所有版本库里的 /tags 目录具有读写权限。如果要对具体每个版本库配置,用如下的语法:
[groups]
project1_committers = paulex, richard
project2_committers = jimmy, michel, spark, tony, Robert
[repos1:/]
* = r
@ project1_committer = rw
[repos2:/]
* = r
@ project2_committer = rw
这样 repos1的 project1_committer 组只能对 repos1 版本库下的文件具有写权限而不能修改版本库 repos2 ,同样 repos2 的 project2_commiter 组也不能修改 repos1 版本库的文件。
====================================================================================================================
4、svn迁移
1. 将原来的Repository导出为一个文件dumpfile
> svnadmin dump F:\repository\test > test
2. 创建新的Repository, 可以用工具创建 也可以用命令创建
3. 将dumpfile导入到新的Repository
> svnadmin load D:\repository\test < test
本机SVN的快速迁移方法:
svnadmin hotcopy old_rep_path new_rep_path
====================================================================================================================
第二种安装方式:
安装subversion-1.7.6.tar.gz版本
下载apache运行环境依赖的包
1.apr包,下载地址:http://apr.apache.org/download.cgi
这边我下载的是 apr-1.4.6.tar.gz,放置在路径/root/dir_install/apr-1.4.6.tar.gz
tar zxvf apr-1.4.6.tar.gz 进行解压,生成apr-1.4.6
cd apr-1.4.6
./configure --prefix=/usr/local/apr
make && make install
安装完毕后,可以验证/usr/local/apr是否存在
问题:
安装apr报错rm: cannot remove `libtoolT': No such file or directory 解决方案
直接打开/usr/local/src/apr-1.4.6/configure 把 $RM "$cfgfile" 那行删除掉 (30048)
$RM "$cfgfile" 大约在 42302 行
然后再重新运行 ./configure --prefix=/usr/local/apr 就可以了
2.apr-uitil包,下载地址:http://apr.apache.org/download.cgi
这边我下载的是apr-util-1.4.1.tar.gz,放置路径/root/dir_install/apr-util-1.4.1.tar.gz
tar zxvf apr-util-1.4.1.tar.gz进行解压,生成apr-util-1.4.1
cd apr-util-1.4.1
./configure --prefix=/usr/local/apu --with-apr=/usr/local/apr/bin/apr-1-config
make && make install
安装完毕后,可以验证/usr/local/apu是否存在
3.neon包,下载地址:http://www.webdav.org/neon/
这边我下载的是neon-0.29.6.tar.gz,放置路径/root/dir_install/neon-0.29.6.tar.gz
tar zxvf neon-0.29.6.tar.gz进行解压,生成neon-0.29.6
cd neon-0.29.6
./configure --prefix=/usr/local/neon
make && make install
安装完毕后,可以验证/usr/local/neon是否存在
4.pcre包,http://pcre.org/
tar zxvf pcre-8.12.tar.gz
cd pcre-8.12
./configure --prefix=/usr/local/pcre
make && make install
安装完毕后,可以验证/usr/local/pcre是否存在
1.安装apache,下载地址http://httpd.apache.org/
这边我下载的是httpd-2.4.1.tar.gz,放置路径/root/dir_install/httpd-2.4.1.tar.gz
tar zxvf httpd-2.4.1.tar.gz进行解压,生成httpd-2.4.1
cd httpd-2.4.1
./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apu/bin/apu-1-config --with-neon=/usr/local/neon/bin/neon-config --with-pcre=/usr/local/pcre/bin/pcre-config --enable-dav --enable-so -enable-maintainer-mode -enable-rewrite
make && make install
2.安装subversion-1.7.6.tar.gz
tar zxvf subversion-1.7.6.tar.gz
解压sqlite-amalgamation-3071602.zip文件把 sqlite3.c 拷贝到subversion-1.7.6下sqlite-amalgamation文件夹下,如果sqlite-amalgamation文件夹不存在手动创建个
./configure --with-apxs=/usr/local/httpd/bin/apxs --prefix=/usr/local/svn --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apu/bin/apu-1-config --with-neon=/usr/local/neon/bin/neon-config --with-ssl
make && make install
安装完成后验证
[root@localhost ~]# ls /usr/local/httpd/modules/
mod_authz_svn.so mod_dav_svn.so //这里会多这两个文件
[root@localhost ~]# vim /usr/local/httpd/conf/httpd.conf //如果这里没有就手动加上
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
报错:
# svnserve --version
svnserve: symbol lookup error: /usr/local/svn/lib/libsvn_subr-1.so.0: undefined symbol: apr_atomic_xchgptr
而subversion要求较高的版本,为此,我们需要删除系统自带的apr,apr-util这两个包!强行删掉!
# rpm -e --allmatches apr-util
error: Failed dependencies:
libaprutil-1.so.0()(64bit) is needed by (installed) subversion-1.4.2-4.el5_3.1.x86_64
libaprutil-1.so.0()(64bit) is needed by (installed) httpd-2.2.3-31.el5.centos.x86_64
libaprutil-1.so.0 is needed by (installed) subversion-1.4.2-4.el5_3.1.i386
# rpm -e --allmatches apr-util --nodeps
# rpm -e --allmatches apr --nodeps
不然svn的命令报错
启动apache的时候报错
/usr/local/http/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.171.251.9. Set the 'ServerName' directive globally to suppress this message
修改http.conf 文件
搜索"#ServerName" 修改为 ServerName localhost:80
至此安装完成。
====================================================================================================================
转载于:https://blog.51cto.com/fangwei009/1624496
相关文章:

通过Windows10上的VS Code打开远端Ubuntu上的项目操作步骤
Ubuntu版本要求是16.04及以上版本。这里以16.04为例。 在Ubuntu上安装OpenSSH server,执行:$ sudo apt-get install openssh-server 在Windows 10 1803上安装Windows OpenSSH Client(注:Windows早期版本则需要安装Git for Windows)࿱…

Java中介者模式
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 意图:用一个中…
那些打着AI万金油旗号的产品欺骗大众,如何识别?
作者 | Arvind Narayanan译者 | 刘畅出品 | AI科技大本营(ID:rgznai100)如今,很多打着AI名号售出的产品都属于万金油系列,没什么实质性的功能。为什么会这样?我们应该如何识别这类AI?幻灯片上是评估性格和工…
分享一款jQuery全屏滚动页面特性案例
分享一款jQuery全屏滚动页面特性案例。我们在来往官网,或者小米官网都会看到全屏滚动页面的一些例子。可以说全屏滚动页面越来越受欢迎。它们就像是竖着的图片轮转一样。这样的页面有很多,如:iPhone 5C页面:http://www.dowebok.co…
后深度学习时代的一大研究热点?论因果关系及其构建思路
作者 | Bernhard Schlkopf译者 | Kolen编辑 | Jane出品 | AI科技大本营(ID:rgznai100)尽管机器学习在现阶段取得了很大成功,但是相比于动物所能完成的工作,机器学习在动物擅长的关键技术上表现不尽人意,比如…

Java观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 意图:定义对象间的一种一对多的依赖关系,当一…

Python3中None用法
1.None是一个空值,空值是Python里的一个特殊值,用None表示。可以将None赋值给任何变量。 var None; print(var) # None if var is None:print("var has a value of None") # print else:print("var:", var) 2.None有自己的数据类型…

try finally 中的return
2019独角兽企业重金招聘Python工程师标准>>> public class Test { public static int test1() { int x 1; try { return x; } finally { x; } } public static int test2() { int x 1; try { return x; } finally { return x; } } public st…
我用Python破解了同事的加密压缩包
作者 | 朱小五来源 | 凹凸玩数据(ID: alltodata)又是一杯奶茶。事情的经过是这样的:又是奶茶,行吧行吧。快点开工,争取李大伟回来之前搞定。李大伟说是6位数字密码那么我们可以利用python生成全部的六位数字密码#生成从…

Ubuntu上通过android toolchain交叉编译Valgrind操作步骤
关于Valgrind的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/50196189. 这里介绍下在Ubuntu 16.04上通过android toolchain如android-ndk-r14b交叉编译Valgrind源码的操作步骤: 1. 从 https://valgrind.org/ 下载最新的版本3.17.0&…

Java状态模式
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 意图:允许对象在内部…

Red Hat 5.8 CentOS 6.5 共用 输入法
pick up from http://jingyan.baidu.com/article/20b68a885a3607796cec622c.html

Python3中with用法
Python中的with语句用于用上下文管理器(context manager)定义的方法包装块的执行,它允许将常见的try…except…finally使用模式封装起来以方便重用。 在Python中,在处理非托管资源(unmanaged resources)(如文件流)时使用with关键字。它允许确保你在使用资…
作为计算机专业的你,这些点你命中了哪些?
是不是学计算机的在别人眼里就得会修电脑?是不是编代码的程序员在别人眼里就得喜欢穿格子衫?是不是从事互联网行业的人在别人眼里就喜欢背双肩包出行?1我学计算机就得会修电脑?前两天我在加班的时候,电话突然响起&…

Java空对象模式
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中,我们…

JSON入门基础知识
2019独角兽企业重金招聘Python工程师标准>>> JSON入门基础 1、JSON定义 JSON:JavaScript 对象表示法(JavaScript Object Notation)。 JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快,更易…

Python3中raise用法
Python中raise语句支持强制触发指定的异常。 raise语法: raise [EXPRESSION [from EXPRESSION]] 如果raise后未跟表达式(expression),则raise重新引发当前作用域中活动的最后一个异常。如果当前范围内没有异常处于活动状态,则会引发RuntimeE…
精选实践 | 爱奇艺实用数据库选型树:不同场景如何快速选择数据库?
作者 | 郭磊涛 爱奇艺数据库和中间件负责人 TiDB User Group Ambassador来源 | 授权转载自AskTUG本文系 TUG 线下活动 “不同业务场景下的数据库技术选型思路” 分享实录。我是爱奇艺的数据库和中间件负责人郭磊涛,今天主要向大家分享数据库选型方面的思路ÿ…

iOS处理高并发量的数据请求和数据集合的对应关系
一、处理高并发请求的核心代码如下: // 创建信号量dispatch_semaphore_t semaphore dispatch_semaphore_create(0);// 创建全局并行dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_group_t group dispatch_gro…
Top 10 Mistakes Java Developers Make(转)
文章列出了Java开发者最常犯的是个错误。 1.将数组转换为ArrayList 为了将数组转换为ArrayList,开发者经常会这样做: ?1List<String> list Arrays.asList(arr);Arrays.asList()会返回一个ArrayList,但这个ArrayList是Arrays的私有静态…

Python3中迭代器介绍
Python中一个可迭代对象(iterable object)是一个实现了__iter__方法的对象,它应该返回一个迭代器对象(iterator object)。迭代器是一个实现__next__方法的对象,它应该返回它的可迭代对象的下一个元素,并在没有可用元素时触发StopIteration异常…
30+博士、100+硕士整理的超全深度强化学习资源清单
作者 | Deep-RL来源 | 深度强化学习实验室(ID:Deep-RL)今天为大家推荐一个开源、开发的 Github 好项目《A Guide for Deep Reinforcement Learning》。这个项目联合了Deep Reinforcement Learning领域的30位博士,100位硕士共同完成…

Java访问者模式
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受…

GNU/Linux平台上正则表达式的简单使用
友情提醒:本博文涉及的内容中涉及到的系统实践操作在Centos6.5上实现,GNU/Linux简称为linux,GNU/grep简称为grep,GNU/sed简称为sed,GNU/gawk简称为awk。-------------------------------------------------楔子------------------…

Linux下addr2line命令用法
Linux下addr2line命令用于将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。当含有调试信息(-g)的执行程序出现crash时(core dumped),可使用addr2line命令快速定位出错的位置。 如果无法确定文件名或函数名,addr2line将在它们的位置打…

JavaMVC 模式
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。View࿰…
从概念到技术,打通「中台」的任督二脉,别再说不知道中台是什么
2019 年,「中台」这个词火了!随着阿里等头部互联网企业搭建和推动中台业务,让越来越多的企业关注中台,纷纷提出「中台战略」,帮助企业自身加速实现数字化转型。不少企业还在观望「中台」:1、我的企业里需要…

php中序列化与反序列化
http://www.cnblogs.com/A-Song/archive/2011/12/13/2285619.html 转自:http://qing.weibo.com/tag/unserialize 把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式unserialize() 恢复原先变量eg:$stooges array(Moe,Larry,Curly);$…

Python3中生成器介绍
生成器(generator):一个返回生成器迭代器的函数。它看起来像一个普通函数,除了它包含用于生成一系列可在for循环中使用的值的yield表达式或者可以使用next函数一次检索一个值。 在Python中,使用了yield的函数被称为生成器。跟普通函数不同的是…
数学学渣必备!拍照上传,分步求解,微软解题神器拯救你
整理 | Jane出品 | AI科技大本营(ID:rgznai100)在学好数学这条路上,很多同志前赴后继「死伤无数」,即便大家不断的寻求「场外救援」,可最终都逃不过一个字:难!两个字:真难…