CentOS 上的 Subversion

Subversion 不是单单为程序编写员而设的……我知道,因为我就不是。最近我开始用它来做后多事情,例如:备份 Nagios 的设置、文件、及任何以文字为基础的东西。我不知道因何我没有更早使用它,但无论如何,事情就是这样了。这份文件简捷地解释安装及设置 subversion,及如何在本地和在联网上通过 Apache 使用它。请参阅它所提供的文档关於完整、复杂的设置及安装。其实坊间有很多关於这个题材的优秀文档,所教授的远超过我对这个工具的认识。假如你像我一样喜欢尝试新的事物,这份文档可以帮助你快速入门。

Contents

  1. 系统
  2. 参考
  3. 安装
  4. 设置
  5. 运用 subversion
  6. 访问控制清单
  7. 后记
  8. 进深阅读

1. 系统

CentOS 4.x/RHEL 4
CentOS 5.1/RHEL 5

2. 参考

Subversion: http://subversion.tigris.org/ 
Version Control with Subversion: http://svnbook.red-bean.com/ 

3. 安装

[root@lucifer ~]# yum install mod_dav_svn subversion

你首先要做的事情就是安装我在上面所提及的两个组件。如果你未安装 Apache,这样做亦会为你把它拉进来。

当你用 yum 安装时,它会列出上面两个组件以外的组件。其它东西亦会自动被安装。视乎你已有的组件,你的经历也许会不同。

4. 设置

4.1. Apache

在你进一步学习之先,你需要确定 Apache 已经被设置好。我假设你在做一个全新的安装,因此如果你的 Apache 已经在运作中……请小心你所做的改动。我亦会解释如何设置基本的口令保护。然而,假若你想容许任何人访问版本库,你可轻易地省略这部份。

你首先要做的事情就是打开 /etc/httpd/conf/httpd.conf,而且最低限度更改 ServerName 这个指引。如果你需要协助或拥有更复杂的设置,请参详 Apache 的文件。

[root@lucifer ~] vim /etc/httpd/conf/httpd.conf —— 作所需修改并存档
[root@lucifer ~] service httpd start
[root@lucifer ~] chkconfig httpd on

在网络上浏览你的机器,http://yourmachine ,看看你能否取得测试页。做得到吗?好了,让我们进到更有趣的事情。

4.2. Subversion 给 Apache 的设置

下一步就是在 Apache 内设置某些设置,好让 Subversion 与 Apache 能够融洽相处。现在让我们看看 Subversion 为你安装的样例配置文件。

[root@lucifer ~] cd /etc/httpd/conf.d/
[root@lucifer ~] vim subversion.conf

# 有需要的话,请确定你删除这两行的注释
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

# 加入下列内容来支持基本验证,并将 Apache 指向实际放置版本库的地方。
<Location /repos>
        DAV svn
        SVNPath /var/www/svn/repos
        AuthType Basic
        AuthName "Subversion repos"
        AuthzSVNAccessFile /etc/svn-auth-conf
        AuthUserFile /etc/svn-passwd-conf
        Require valid-user
</Location>

上面的位置是 Apache 在 URL 列上使用的。举个例说:http://yourmachine/repos 指向你所指定的 SVNPath。上面只是一个样例,因此请按你的首选放置东西。请确定你在完成编辑后存储文件。

然后我们须要创建你在上一部所指定的口令档。开始时你要利用 -cm 这个选项。它会创建文件并用 MD5 将口令加密。如果你需要加用户,请确定你只使用 -m 选项,而不包含初次创建时的 -c。

[root@lucifer ~] htpasswd -cm /etc/svn-auth-conf yourusername
New password:
Re-type new password:
Adding password for user yourusername
[root@lucifer ~] htpasswd -m /etc/svn-auth-conf anotherusername
New password:
Re-type new password:
Adding password for user anotherusername

 

4.3. 设置你的版本库

你接著要做的事情就是创建你用来提交及取出文件的版本库。利用 svn 所包含的工具,这是很容易的。

[root@lucifer ~] cd /var/www/ —— 或者你在上面所指定的路径
[root@lucifer ~] mkdir svn
[root@lucifer ~] cd svn
[root@lucifer ~] svnadmin create repos
[root@lucifer ~] chown -R apache.apache repos
[root@lucifer ~] service httpd restart

现在去测试你能否通过网页浏览器访问你的版本库:http://yourmahcine/repos 。你应该取得一个对话框询问用户名称及口令。若然是这样,请输入你的凭证,然后你应该看见一版 Revision 0:/ 的页面。这样的话,版本库的设置便大工告成了。如果你须要多个版本库,请参考上面连结内的文档。这里只示范如何设置一个版本库及开始应用它。话说回来,让我们就这样做。

5. 运用 subversion

5.1. 分配你的版本库

如果一切顺列,你现在应该已准备好使用你所创建的版本库。subversion 的 svn 工具是你将要用来与数据库沟通的命令行客户端。若要看这个工具的用法:

[root@lucifer ~] svn --help

你最有机会使用的选项是:svn import、svn commit(ci)、svn checkout(co)。开始时你会用 import 将文件输入你的版本库;你会用 checkout 取出它们作修改;你会用 commit 将改动提交到数据库内。一旦你见过它们被应用数次,这便颇为简单。

在我继续之先,我希望解释关於目录结构的分配。几乎所有文件都谈及用某个分配方法创建你的目录。他们会提及要确定你在根目录下设有 branches、tags 及 trunk 目录,当中 trunk 会包含你的所有文件。就例如:

.
|-- project1
|   |-- branches
|   |-- tags
|   `-- trunk
`-- project2
    |-- branches
    |-- tags
    `-- trunk

参考书会较详细解释这样做的原因,但我基本上不会采用这种分配……这是因为我不算是写程序或维护「项目」。我主要用它来存储相对简单的配置文件及文件。请用适合你的方式来设置。

作为一个样例,我会创建一些示范用的目录及放置一些文件在其中。这是在 SVN 服务器上做的。请照样做。

[root@lucifer ~] cd /tmp
[root@lucifer ~] mkdir mytestproj
[root@lucifer ~] cd mytestproj
[root@lucifer ~] mkdir configurations options main
[root@lucifer ~] vim configurations/testconf1.cfg —— 放你喜欢的东西在这些文件内。
[root@lucifer ~] vim options/testopts1.cfg
[root@lucifer ~] vim main/mainfile1.cfg

请记得你可以随你的自己的意思进行分配。当你完成了你所须的首个分配后,让我们向前进并将它输入 subversion 内。

5.2. 输入

[root@lucifer ~] svn import /tmp/mytestproj/ file:///var/www/svn/repos/mytestproj -m "Initial repository layout for mytestproj"
Adding         /tmp/mytestproj/main
Adding         /tmp/mytestproj/main/mainfile1.cfg
Adding         /tmp/mytestproj/configurations
Adding         /tmp/mytestproj/configurations/testconf1.cfg
Adding         /tmp/mytestproj/options
Adding         /tmp/mytestproj/options/testopts1.cfg

 

5.3. 取出

现在利用网页浏览器取出文件:http://yourmachine/repos 。你应该能够取出你所输入的东西。一旦你在本地的 SVN 服务器上载了你最初的分配,你只需用先前所创建的户口连接到 subversion 服务器,便可以在另一台远程的机器上使用它。让我们测试一下。

[me@mylappy ~] cd /tmp
[me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj
Authentication realm: <http://yoursvnserver:80> Subversion repos
Password for 'youruser':
A    mytestproj/main
A    mytestproj/main/mainfile1.cfg
A    mytestproj/configurations
A    mytestproj/configurations/testconf1.cfg
A    mytestproj/options
A    mytestproj/options/testopts1.cfg
Checked out revision 1.

 

5.4. 编辑及提交

正如你所见,你已经从 subversion 服务器取出了第 1 版。现在你可以编辑一些东西,然后将改动提交给 subversion 服务器。

[me@mylappy ~] cd mytestproj
[me@mylappy ~] vim configurations/testconf1.cfg —— 加入或删除某些东西并存档。
[me@mylappy ~] svn commit -m "Added a line to testconf1.cfg."
Sending        configurations/testconf1.cfg
Transmitting file data .
Committed revision 2.

这样做的一个好处,就是你可以删除刚才在你的机器上所取出的所有目录。你取出它们的唯一目的,就是要编辑它们,然后将它们送返主机。请浏览你的服务器来取出不同文件。

5.5. 新增/删除对象

这一切都很好,但你如何在现存的版本库内加入更多文件?很简单,就是利用 add 这个引数。请你现在就取出你最新的版本,复制一个文件到目录内,加入这个文件,然后提交你的改动。

[me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj
A    mytestproj/main
A    mytestproj/main/mainfile1.cfg
A    mytestproj/configurations
A    mytestproj/configurations/testconf1.cfg
A    mytestproj/options
A    mytestproj/options/testopts1.cfg
Checked out revision 2.

[me@mylappy ~] cd mytestproj
[me@mylappy ~] cp /etc/yum.repos.d/CentOS-Base.repo configurations/
[me@mylappy ~] svn add configurations/CentOS-Base.repo
A         configurations/CentOS-Base.repo

[me@mylappy ~] svn commit -m "Added the CentOS Yum repo file."
Adding         configurations/CentOS-Base.repo
Transmitting file data .
Committed revision 3.

要删除对象,你只须以 delete 代替 add。提交你的改动,然后便成了。就是这么简单。再次返回你的浏览器,你会发现版本号码是 3。你应该可以点击文件并找出你所做的改动。

5.6. 撤消

这些都非常好,但我如何撤消到旧的版本……这不是 subversion 的用意吗?对,这很容易。好果你不清楚你现有的版本……看看 log 这个指令。这解释了你为何每次提交时要放入信息。它们要简洁,但含足够数据来提醒你或许忘掉了的事情。

[me@mylappy ~] svn log http://yoursvnserver/repos —— 这针对整个版本库
[me@mylappy ~] svn log http://yoursvnserver/repos/mytestproj —— 这针对个别项目

你会取得一个完整的版本列表连同注解,正如我上面所讲。这样你便能选择你现在想取回哪个版本。

[me@mylappy ~] svn co -r 1 http://yoursvnserver/repos/mytestproj

这个指令会取回第 1 个版本。

6. 访问控制清单

一般来说,你不会想将所有版本库的访问权给予所有用户。你可以利用 ACL 来限制每位用户访问版本库的权限。ACL 可以通过 AuthzSVNAccessFile 这个文件选项来启用,它以一个文件名作为参数。例如:

AuthzSVNAccessFile /etc/svn-acl-conf

你可以在相关的 Location 部份加入它:

<Location /repos>
        DAV svn
        SVNParentPath /var/www/svn/repos
        AuthzSVNAccessFile /etc/svn-acl-conf
        AuthType Basic
        AuthName "Subversion repos"
        AuthUserFile /etc/svn-auth-conf
        Require valid-user
</Location>

然后你可以创建 /etc/svn-acl-config。这个文件内藏有这个格式的分段:

[版本库名称:版本库路径]
用户 = 访问权

当中访问权可以是 r(只读)、rw(读写)、或空白(禁止访问)。缺省的 ACL 是禁止用户访问版本载。假设你有一个名叫 framework 的版本库,而你想给 john 只读的权限,及joe 读写的权限。你可以加入下面这个分段:

[framework:/]
john =  r
joe = rw

你亦可以在名叫 groups 的分段内置立群组,然后在访问控制清单内将 @ 符号放在群组前面。例如:

[groups]
staff = joe, george

[framework:/]
john =  r
@staff = rw

如果你想令所有用户能阅读每个版本库,你可以为每个版本库的根目录加入以下一个分段:

[/]
* = r

 

7.Linux中SVN的备份与恢复

linux中SVN备份有三种方式

1、svnadmin dump 是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供版本恢复机制。

缺点是版本数过大,增长到数万以上,那么dump与load过程都将非常慢,耗时长不利于快速进行灾难恢复。在版本数较小的情况下可以使用这种备份方式。

2、svnadmin hotcopy 只能进行全量拷贝,不能进行增量备份。优点是备份较快,恢复也快。缺点是比较耗费硬盘。

3、svnsync实际是制作2个镜像库,当一个坏了的时候可以迅速切换到另一个。需1.4以上版本支持,这里不讨论。

svnadmin dump方式:

1、全量备份一个仓库:

#svnadmin dump /svn/svn/APP > /svn/svndump/APP_dump160802

在另一台机器上配置同样的SVN服务器导入dump出来的备份文件

#svnadmin load /svn/svn/APP < APP_dump160802

将原先服务器的配置文件备份后复制到新服务器中 authz、passwd、svnserver.conf

2、增量备份

#svnadmin dump /svn/svn/APP -r 5200:5600 --incremental > /svn/svndump/APP_5600   

5200是上次全量备份时的最新版本,5600是当前最新版本。

导入:svnadmin load /svn/svn/APP < APP_5600

svnadmin hotcopy方法:
1. 备份

svnadmin hotcopy /svn/svn/APP/ /data/svn.`date +%F:%T`.bak –clean-logs

如果传递–clean-logs选项,svnadmin会执行热拷贝操作,然后删除不用的Berkeley DB日志文件。
你可以在任何时候运行这个命令得到一个版本库的安全拷贝,不管其它进程是否使用这个版本库。
2. 还原

svnadmin hotcopy /home/svn.`date +%F:%T`.bak  /home/svn.`date +%F:%T`.bak

8. htpasswd用法

apache htpasswd命令用法

  htpasswd [-cmdpsD] passwordfile username

  htpasswd -b[cmdpsD] passwordfile username password

  htpasswd -n[mdps] username

  htpasswd -nb[mdps] username password

apache htpasswd命令选项参数说明

  -c  创建一个加密文件

  -n  不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

  -m  默认apache htpassswd命令采用MD5算法对密码进行加密

  -d  apache htpassswd命令采用CRYPT算法对密码进行加密

  -p  apache htpassswd命令不对密码进行进行加密,即明文密码

  -s  apache htpassswd命令采用SHA算法对密码进行加密

  -b  在apache htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码

  -D  删除指定的用户

  在Windows, NetWare and TPF 系统中 ‘-m’选项是默认的,在使用apache htpasswd命令时可以忽略。在其他系统中,’-p’选项可能不能工作。

apache htpasswd命令用法实例

1、如何利用htpasswd命令添加用户?

  htpasswd -bc .passwd 123 123

  在bin目录下生成一个.passwd文件,用户名123,密码:123,默认采用MD5加密方式

2、如何在原有密码文件中增加下一个用户?

  htpasswd -b .passwd abc abc

  去掉c选项,即可在第一个用户之后添加第二个用户,依此类推

3、如何不更新密码文件,只显示加密后的用户名和密码?

  htpasswd -nb abc abc

  不更新.passwd文件,只在屏幕上输出用户名和经过加密后的密码

4、如何利用htpasswd命令删除用户名和密码?

  htpasswd -D .passwd abc

5、如何利用htpasswd命令修改密码?

  htpasswd -D .passwd abc

  htpasswd -b .passwd abc abc

  即先使用htpasswd删除命令删除指定用户,再利用htpasswd添加用户命令创建用户即可实现修改密码的功能。

  至此,apache htpasswd命令的具体介绍和使用方法就介绍完了。

ps aux|grep svnserve
cd /shiyu
vim passwd
vim authz
配置SVN密码加密:htpasswd -b ./http_passwd abc abc123

  9. Linux下 Apache+SVN 让用户自行修改SVN密码

默认在Linux下Apache+SVN没有提供用户修改密码功能,这里利用PHP脚本来为用户提供一种修改密码的方法。

第一步,用户在修改密码之前需要先登录,而登录的验证方法和访问SVN是一样的,在/etc/apache2/mods-available/alias.conf中加入如下配置

Alias /svntools/ "/var/www/svntools/"  
<Directory "/var/www/svntools">  
    AuthType Basic  
    AuthName "svntools repository"  
    AuthUserFile /var/repository/htpasswd<span style="font-family: Arial, Helvetica, sans-serif;">  </span>
    Require valid-user  
</Directory> 


第二步,创建 /var/www/svntools 目录,创建一个php文件,如index.php,输入以下代码
<?php
$username = $_SERVER["PHP_AUTH_USER"]; //经过 AuthType Basic 认证的用户名
$authed_pass = $_SERVER["PHP_AUTH_PW"]; //经过 AuthType Basic 认证的密码
$input_oldpass = (isset($_REQUEST["oldpass"]) ? $_REQUEST["oldpass"] : ""); //从界面上输入的原密码
$newpass = (isset($_REQUEST["newpass"]) ? $_REQUEST["newpass"] : ""); //界面上输入的新密码
$repeatpass = (isset($_REQUEST["repeatpass"]) ? $_REQUEST["repeatpass"] : ""); //界面上输入的重复密码
$action = (isset($_REQUEST["action"]) ? $_REQUEST["action"] : ""); //以hide方式提交到服务器的action
if($action!="modify"){
$action = "view";
}
else if($authed_pass!=$input_oldpass){
$action = "oldpasswrong";
}
else if(empty($newpass)){
$action = "passempty";
}
else if($newpass!=$repeatpass){
$action = "passnotsame";
}
else{
$action = "modify";
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Subversion 在线自助密码修改</title>
</head>
<body>
<?php
//action=view 显示普通的输入信息
if ($action == "view"){
?>
<script language = "javaScript">
<!--
function loginIn(myform)
{
var newpass=myform.newpass.value;
var repeatpass=myform.repeatpass.value;
if(newpass==""){
alert("请输入密码!");
return false;
}
if(repeatpass==""){
alert("请重复输入密码!");
return false;
}
if(newpass!=repeatpass){
alert("两次输入密码不一致,请重新输入!");
return false;
}
return true;
}
//-->
</script>
<style type="text/css">
<!--
table {
border: 1px solid #CCCCCC;
background-color: #f9f9f9;
text-align: center;
vertical-align: middle;
font-size: 9pt;
line-height: 15px;
}
th {
font-weight: bold;
line-height: 20px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-bottom-style: solid;
color: #333333;
background-color: f6f6f6;
}
input{
height: 18px;
}
.button {
height: 20px;
}
-->
</style>
<br><br><br>
<form method="post">
<input type="hidden" name="action" value="modify"/>
<table width="220" cellpadding="3" cellspacing="8" align="center">
<tr>
<th colspan=2>Subversion 密码修改</th>
</tr>
<tr>
<td>用户名:</td>
<td align="left"> <?=$username?></td>
</tr>
<tr>
<td>原密码:</td>
<td><input type=password size=12 name=oldpass></td>
</tr>
<tr>
<td>用户密码:</td>
<td><input type=password size=12 name=newpass></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input type=password size=12 name=repeatpass></td>
</tr>
<tr>
<td colspan=2>
<input οnclick="return loginIn(this.form)" class="button" type=submit value="修 改">
<input name="reset" type=reset class="button" value="取 消">
</td>
</tr>
</table>
</form>
<?php
}
else if($action == "oldpasswrong"){
$msg="原密码错误!";
}
else if($action == "passempty"){
$msg="请输入新密码!";
}
else if($action == "passnotsame"){
$msg="两次输入密码不一致,请重新输入!";
}
else{
$passwdfile="/var/repository/htpasswd";
$command='"/usr/bin/htpasswd" -b '.$passwdfile." ".$username." ".$newpass;
system($command, $result);
if($result==0){
$msg="用户[".$username."]密码修改成功,请用新密码登陆.";
}
else{
$msg="用户[".$username."]密码修改失败,返回值为".$result.",请和管理员联系!";
}
}
if (isset($msg)){
?>
<script language="javaScript">
//<!--
alert("<?=$msg?>");
window.location.href="<?=$_SERVER["PHP_SELF"]?>"
//-->
</script>
<?php
}
?>
</body>
</html>

  10. 后记

这只是 subversion 能赋予你的能力的很小部份。这份入门指南能助你一把,初步示范如何使用它,并理解它的运作。你可以用 subversion 的工具做各样事情,所以请记得查阅文档来学习关於可以协助你的不同选项。另外请留意为你的需要安装 Apache 也许是小题大做。要完全使用 subversion 的工具,你可以在本地的机器上指定 file:///path/to/repo ,而不必像我的 Apache 样例般使用 http://yoursvnserver/repos/whatever 。据闻很多人都在他们的主机上用它来管理大型项目及配置文件,免得自己发疯。祝你好运。

11. 其他

 svn的授权文件authz默认是不支持中文路径的,因此在精确控制中文文件夹的授权时往往会出错。要解决这个问题,需要用UltraEdit(注意不要用记事本或写字板)把authz打开,然后另存在为UTF-8 -无BOM,如下图:

然后把另存在的authz文件覆盖原有的authz文件。

        用记事本或写字板打开authz文件后另存为utf8编码的文件的话,文件开头会有windows特有的unicode标记——ef bb bf,而这三个字节是svn所不能识别的。所以不能用记事本或写字板打开authz文件另存。

    以后要编辑authz文件也需要用UltraEdit进行编辑和保存,用记事本或写字板编辑后保存也会自动带上windows特有的unicode标记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值