svn 实用笔记

来源:互联网 发布:网络摄像机设置 编辑:程序博客网 时间:2024/05/16 02:36
上周(10月12-10月16)做了一个本机的svn系统,初步实现了在本机使用svn来管理代码。
刚刚又实现了在公司局域网内的svnserve服务,并成功import代码到服务器上。
 
这里做些笔记,以作备忘。
 
 
 
整个过程很简单,主要参考了“svnbook.pdf”,来自:
http://www.subversion.org.cn/svnbook/1.4/svnbook.pdf
还有这里也有参考到:
http://www.svn8.com/svnpz/20080316/342.html
还有这里也有很大帮助:
http://wiki.iusesvn.com/index.php/Subversion%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%A4%E7%A7%8D%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F%E6%89%80%E7%94%A8%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%8F%8A%E6%A0%BC%E5%BC%8F
 
 
 
首先说在本机的svn系统吧,主要参考了“svnbook.pdf”,也就是几个步骤:
1、设置svn的文件存储目录,比如要在这个目录“/mnt/hgfs/svn/”保存代码及svn的相关文件,这样做:
[***@** /]$ cd /mnt/hgfs/svn
[***@** svn]$ svnadmin create repos   # 创建了repos目录,repository的简写
                                      # repos下面保存代码及svn的相关文件
[***@** svn]$ ls repos
conf/  dav/  db/  format  hooks/  locks/  README.txt
 
2、将源代码导入到repos
$ svn import /tmp/myproject file:///mnt/hgfs/svn/ -m "初次导入"
 
就这两步就可以了,接下来就是用svn了
 
 
 
今天(10月19)上午配了svnserve,主要参考了后面两个网页,也就只这几个步骤:
 
1、
同样,在服务器上创建代码仓库目录,这样做:
$ svnadmin create repos
 
2、
修改相应的两个配置文件,“repos/conf/svnserve.conf”和“repos/conf/passwd”
 
2.1、
svnserve.conf 是 svnserve 的配置文件,只要取消这行的注释即可(指定密码文件):
password-db = passwd
 
2.2、
passwd 就是密码文件,里面用明文保存了用户名和密码,在“[users]”下面增加类似这样的行:
harry = harryssecret   # harry是用户名,harryssecret是密码(竟然是明文,^_^)
 
3、
启动svnserve:
$ svnserve -d -r repos/   # -d和-r的顺序不能反,否则出错
 
就这样,一个简单的svnserve服务器就建好了
 
4、
上传代码,这样做:
$ svn import p1 svn://ip***/p1 -m "初步"
认证领域: cee5389b-64b6-41ab-92e4-8afc7a4dd521
“***”的密码:
新增           p1/image
...
 
注:
    ip*** 是 svnserve 服务器的IP地址
 
 
 
另外,如果要关闭svnserve,可以先找到svnserve进程,再用kill杀掉即可:
$ ps -ax  | grep svnserve
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
 3063 ?        Ss     0:00 svnserve -d -r repos/
 3075 pts/3    S+     0:00 grep svnserve
$
$ kill -9 3063
$
 
 
 
再帖man svnserve的两个参数“-d”和“-r”的含义:
$ man svnserve
...
       -d, --daemon
            Causes  svnserve  to  run  in daemon mode.  svnserve backgrounds itself and accepts and serves TCP/IP connections on the svn port (3690, by default).
...
       -r root, --root=root
            Sets  the  virtual root for repositories served by svnserve.  The pathname in URLs provided by the client will be interpreted relative to this root, and will not be  allowed to escape this root.
...
 
 
 
2009.10.28 补充______________________________________________________________
 

svnbook.pdf 的 P69 / P45
 
从 svn 服务器取出一个不带有“.svn”目录的版本:
svn export svn://ip***/project -r ***(版本号)
 
 
 
2009.11.3  补充______________________________________________________________
 
 
svnbook.pdf 的 P72 / P48
 
比较文件的当前内容与服务器上最新内容的差别用:
svn diff -r head
 
而“svn diff”命令只是比较文件的当前内容与本机上最新内容的差别。(见P54/P29)
 
 
 
 
2009.11.6  补充______________________________________________________________
 
 
比较文件abc.c的版本25和62之间的差别:
svn diff abc.c -r 25:62
 
 
 
 
2009.11.11 补充______________________________________________________________
 
 
想修改原来上传时用户名和密码,可以先清除原来的用户名密码,然后上传时输入新的用户名和密码并保存即可。
 
使用TortoiseSVN,清除原来的用户名和密码可以这样做:
点右键,选“TortoiseSVN”->“设置”->“己保存数据”->“论证数据”,点右边的“清除”按钮即可。
 
 
 
 
2009.11.12 补充______________________________________________________________
 
 
linux下改变用户名和密码可以这样做:
 
一、麻烦的办法
 
1、删除 ~/.subversion/auth/svn.simple/ 下面的相关文件。
2、上传时会先要你输旧用户名的密码,如果直接回车,就会提示让你输入用户名,这时输入新的用户名后回车,再输入新用户名的密码,就可以了。
 
相关文件:
查看 ~/.subversion/auth/svn.simple/ 下的文件,其中有用到服务器的服务器地址和用户名。找到后删除即可。
 
主要参考了这里:
1、http://blog.csdn.net/hong201/archive/2008/04/24/2324706.aspx
2、http://jmatrix.net/dao/case/case.jsp?case=7F000001-EAC5A-11BC755721D-1A86
 
 
 
二、更简单的办法:
 
$ svn --username aaa commit test.c -m "..."
认证领域: ***-***-***...
“aaa”的密码:
正在发送       test.c
传输文件数据.
提交后的版本为 125。
$
 
这样之后svn 就都用新用户名 aaa 来上传了
 
 
 
三、一些说明
 
麻烦的办法也不是一无是处,在windows下也有类似的方法。
 
 
http://jmatrix.net/dao/case/case.jsp?case=7F000001-EAC5A-11BC755721D-1A86
上面的网站有一些说明:
 
Subversion will cache your username/password combination based on which server you are connecting to. Re-connecting to the same server, svn will use your auth cache.
...
 
You can explicitly pass user/password information to subversion at the command line. Simply issue commands like this:
svn --username [user] --password [pass] co ...
 
Also, you can tell Subversion to not store password information to the auth cache for the current command:
svn --no-auth-cache ...
 
 
 
四、一个发现
 
删除 ~/.subversion/auth/svn.simple/ 下的相应文件后,并使用新用户后,会重新建立相应的文件,这个文件的文件名与之前使用旧用户时的文件名一样,不知道有没有什么玄机?
 
 
 
 
2009.12.25 补充______________________________________________________________
 
 
今天上午想在vmware的虚拟机上建一个svnserver,想在上面试验 修改日志的功能。
 
走了前面的1、2步后,在另一个vmware 虚拟机想上传时,出现“没有到主机的路由”的问题,如下:
[***@** ~]$ svn import study/sqlite/sqlite-3.6.5/ svn://192.168.2.133/p1 -m "初步"
svn: 无法连接主机“192.168.2.133”: 没有到主机的路由
 
如果用TortoiseSVN 连“svn://192.168.2.133/sqlite-3.6.5/”,则会报错:
无法连接主机“192.168.2.133”: 套接字操作尝试一个无法连接的主机。
 
网上找了找,是防火墙的原因,在这里发现一个解决问题的方法:
http://bbs.iusesvn.com/archiver/tid-129.html
 
其中说到:
...
在/etc/sysconfig/iptables中的最后一行上面添加了“-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT”即可。
...
 
用root帐号登录后,看了一下“/etc/sysconfig/iptables”的内容,发现ssh (端口号是22)也有一个同样的语句,只除了“--dport”后面不一样,其他都相同。
 
想到曾经看过的iptable 运行时对规则是一条条顺序读取的,试过放到最后svn 提示还是“没有到主机的路由”,于是放到 ssh 语句后面,再试,提示变成“认证失败”,如下:
[***@** sqlite]$ svn import sqlite-3.6.5/ svn://192.168.2.133/ -m "start"
svn: 认证失败

这说明已经防火墙问题已经解决了,问题转到svnserver 这边了,:)。
 
又在网上搜了一下,再看了一下前面,才发现第2步没走全,还要把“repos/conf/svnserve.conf”里的“password-db = passwd”这行的注释去掉,这样做后就一切正常了,^_^
 
 
### ### ### ### ### ###
 
 
弄了大半天,把修改日志的功能加好了,几个卡住的点记录一下,作备忘用,:)
 
修改日志的功能是通过钩子脚本提供的,脚本位置在“repos/hooks/”下,名字是“pre-revprop-change”,内容主要参考了这里:
http://bbs.iusesvn.com/viewthread.php?tid=2367
 
 
1、名字
一开始以为是“pre-revprop-change.bat”,看了几个网页后才明白,“pre-revprop-change.bat”是针对windows 系统的,linux 下这个脚本的名字就是“pre-revprop-change”;
 
与名字对应的,脚本的内容也不一样,windows 的更多一点,比如“REPOS="$1"”前都要加 set,写成“set REPOS="$1"”,等等。
 
2、权限
“pre-revprop-change”的权限必须是可执行的,不然会报错“钩子...失败,错误输出是: ”,空的错误输出可能是因为这是svn 没定义的一种错误。
 
3、脚本如下,一定注意不要遗漏了“$”,我就犯了一个这样的错误,遗漏了 66行 ACTION前的“$”,结果报错:
钩子...失败,错误输出是:
Changing revision properties other than svn:log is prohibited
 
 57 REPOS="$1"
 58 REV="$2"
 59 USER="$3"
 60 PROPNAME="$4"
 61 ACTION="$5"
 62
 63 if [ "$USER" != $(/usr/bin/svnlook author -r "$2" "$1") ]; then
 64     echo "author error!" >$2
 65     exit 1
 66 elif [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then
 67     exit 0
 68 fi
 69 echo "Changing revision properties other than svn:log is prohibited" >&2
 70 exit 1
 
 
 
 
 
 
2010.1.28 补充______________________________________________________________
 
一个月过去了,进入2010年,时间的一个里程碑。新年里,有很多期望,我会踏实的一步步去实现!
 
继续svn话题,前面的都是最简单的svnserve且单个项目的笔记,写了这么多,够啰嗦 ^_^
 
随着svn在公司应用逐步深入,又提出了架设多个项目的svn服务器的需求。
 
一开始我继续用svnserve架设多个项目的版本库服务器。过程不太顺利,下面记录遇到的问题和解决办法。
 
一开始以为很麻烦,瞎琢磨了很多天,看文档,看网页。文档主要还是“svnbook.pdf”,说几句牢骚话,翻译质量感觉一般...,好多话都不明不白,也许适合高手,菜鸟看可能有点浪费时间。
 
 
1、
网页看了很多,但是方向错了,总是往难的方向想,试得太少,因为绝大多数网页都只说这样就可以:
svnadmin create repos
svnadmin create repos/proj1
svnadmin create repos/proj2
 
而没说这样做之后,客户端访问应该怎么做。而我总是会在客户端上出问题。经常是配置好了,但是访问的时候出问题。
 
 
比如下面一个典型的配置:
svnadmin create repos
svnadmin create repos/proj1
svnadmin create repos/proj2


### ### ### ###### ### ### ### ###

repos/conf/svnserve.conf的内容(默认是无内容):
[general]

repos/proj1/conf/svnserve.conf 和 repos/proj2/conf/svnserve.conf的内容相同:
[general]
anon-access = none
auth-access = write
password-db = ../../../conf/passwd
authz-db = ../../../conf/authz


### ### ### ###### ### ### ### ###

与repos同级创建了一个conf目录,这个目录下有两个文件:passwd 和 authz
mkdir conf/

其中passwd的内容:
[users]
adm = adm
p1u1 = 111
p2u1 = 111


authz的内容:
[groups]
adm = adm
p1 = p1u1
p2 = p2u1

[/]
* = r

[proj1:/]
@p1 = rw
@adm = rw
@p2 =

[proj2:/]
@p2 = rw
@adm = rw
@p1 =
 
### ### ### ###### ### ### ### ###
 
服务器上这样配置好之后,在客户端用TortoiseSVN里导入时,一开始在URL那里用“svn://192.168.2.133/repos/proj1”,总是失败,提示“Access denied”,又是琢磨半天,实在想不明白原因... (觉得自己真是笨到家了,想撞墙 :()
 
后来不知道怎么想的,试着在URL那里输入“svn://192.168.2.133/proj1”,结果就成功了...
 
估计中间被这个问题耽误了不少时间,真不知道要怎么弥补...
 
几点笔记:
1、如果[proj1:/] 用 [/repos/proj1:/]代替,则“@p2 = ”的作用将会失效,也就是说只能用“[proj1:/]”这种形式。
 
2、注释不能加在规则后面,否则会报类似这样的错:
The character '#' in rule '@p2' is not allowed in authz rules
 
以“#”开头的注释可以加在每个项目规则的前面,如这样:
# 允许组p1的成员和组adm的成员有读写权限,但对组p2的成员则拒之门外
[proj1:/]
@p1 = rw
@adm = rw
@p2 =
 
3、在authz 的规则里,以@ 开头的表示这是组名。
 
4、http://swjr.blog.com.cn/archives/2006/TheRoadToSubversion1authz.shtml#id15
这个网址的文章“Subversion之路----利用 svnserve.exe 实现精细的目录访问控制(v1.0)”详细讲解了autoz 的写法。
 
 
这种方式有一个问题是密码管理,密码是明文,且客户端不方便自己修改。
 
 
 
因为密码管理的问题,决定试建基于apache 的svn 服务器,以下是过程记录:
 
奇怪的权限(?)问题,只有在“/usr/local/”下建的版本仓库才可以正常访问,在“/home/pax/repos/”和“/root/repos/”都不能正常访问,原因是什么?
用Chrome浏览器看“http://192.168.2.133/svn/”,报错:
Could not open the requested SVN filesystem
 
 
 
 
 
 
2010.1.29 补充______________________________________________________________
 
昨天的那个权限(?)问题,今天没试,不过做了一些别的试验后,觉得可能是没有做“chown -R apache.apache ***”,貌似httpd 只能用apache 做版本仓库的主人?
 
apache + subversion 方式建版本库服务器,没有用最新版本的 apache 和 subversion,而是在己有基础上,安装上mod_dav_svn模块后,再配置相关文件,相当不错,^_^
 
这个思路主要来自这里:
<>
网址:http://doc.iusesvn.com/show-12-1.html
 
主要参考了下面这个文章:
<<使用mod_dav_svn访问Subversion仓库>>,网址:http://www.uml.org.cn/pzgl/200908078.asp
 
mod_dav_svn-1.4.3-4 不容易找,在这里找到的:
http://rpm.pbone.net/
 
mod_dav_svn 的版本要与subversion 的版本相同(?),fedora-7.0 里subversion 的版本是subversion-1.4.3-4,因此 mod_dav_svn 的版本也必须是 1.4.3-4。找了一个别的版本的mod_dav_svn ,安装时提示不支持。
 
 
 
 
2010.2.23 补充______________________________________________________________
 
将svnserve 设置为开机后自动开启。
 
主要参考了下面的内容:
http://zhidao.baidu.com/question/27937543.html
linux中的/etc/rc.d/init.d 这个目录的主要功能是什么?
 
里面说到:
在 rc3.d (或其它目录下 rc0.d ~ rc6.d )目录中 S 开头的档案为执行该服务, K 为开头的档案则是杀掉该服务的意思。
 
后面跟的那些数字代表的意义为何?
那就是启动的顺序啦!例如S12syslog 会比S90crond 更早被执行呢!
 
 
 
基于上面的描述,用root 用户在/etc/init.d/ 下写了一个脚本 svn,并加上可执行权限,其内容是:
#! /bin/bash
cd /home/test/svn; \
svnserve -d -r repos/
 
然后在 /etc/rc.d/rc5.d/ 下做了一个链接 S56svn,指向 /etc/init.d/svn:
ln -s /etc/init.d/svn /etc/rc.d/rc5.d/S56svn
 
这样,开机后,svnserve 会在S55sshd 和S60nfs 之间启动,并且由root 启动。
 
 
 
 
2010.2.23 补充______________________________________________________________

svn + apache,原来是单独一篇文章,想了一下还是合并到一起吧





架设版本库有多种方式,svn + apache 是其中一种,这种方式以前怕麻烦没试,现在已经基本搞定。

下面是一些笔记,作备忘用。

环境:Fedora-7.0 (装在vmware-6.0.5上)

一、主要的参考网页:
1、http://www.uml.org.cn/pzgl/200908078.asp
使用mod_dav_svn访问Subversion仓库
2、http://doc.iusesvn.com/show-12-1.html
RHEL5/CentOS5 轻松安装 Subversion+apache+mysql+ssl


二、过程记录

整个过程没有用最新版本的 apache 和 subversion,而是在fedora-7.0 本身的 apache(httpd-2.2.4-4) 和 subversion-1.4.3-4 基础上再安装mod_dav_svn模块,然后配置相关文件...,最后成功,过程相当的简单 ^_^

mod_dav_svn-1.4.3-4 不容易找,在这里找到的: (这是成功的第一步,也是非常关键的一步!)
http://rpm.pbone.net/

mod_dav_svn 的版本要与subversion 的版本相同(?),fedora-7.0 里subversion 的版本是subversion-1.4.3-4,因此 mod_dav_svn 的版本也必须是 1.4.3-4。找了一个别的版本的mod_dav_svn ,安装时提示不支持。






三、问题记录

1.)
中间遇到一些问题,以前的有些不记得了,今天刚遇到的问题有一个,暂时记这个:

建好版本库服务器后,导入数据时,发生了如下错误:
Can't create directory '/var/www/svn/proj1/db/transactions/0-1.txn': Permission denied

查了google,做了一些试验,又自己总结了一下,这种情况有两个地方要搞定:
1、proj1的主人和组不对,“chown -R apache.apache ***”就可以了;
2、SELinux的问题,将SELinux停止掉。

第一点,上网查一下 httpd 的文档 (主要是鸟哥的私房菜),知道httpd 的主人和组在“/etc/httpd/conf/httpd.conf”里规定好了都是 apache:
...
User apache
Group apache
...

而svn服务是在 httpd 之上的,因此访问svn 版本库的用户实际上是 apache,所以如果proj1 的主人和组都是root 的话,用户apache 肯定没权限了。

这里只要把proj1的用户和组都改成 apache,就可以正常访问了。


SELinux也会造成这类问题,在这里找到一个碰到同样问题的网页:
http://baisong.bokee.com/6336541.html

把SELinux 禁掉就好了,不过在fedora-7.0 里要用root用户登录才行,不知道别的是不是这样的。






2010.2.26 补充______________________________________________________________

今天在正式的服务器上加上了自助密码修改功能,过程很顺利,主要参考了下面的网页:
http://bbs.iusesvn.com/archiver/tid-1837-page-1.html
Subversion的自助密码修改(windows、linux均通过)

在“/etc/httpd/conf.d/subversion.conf”最后增加一段:
Alias /changepassword "/var/www/svn/repos/chpass/"

Require valid-user
# how to authenticate a user
AuthType Basic
AuthName "Subversion Tools"
AuthUserFile /var/www/svn/repos/conf/svnusers.conf


其中用到的几个目录要根据实际情况修改。



在windows 下,用记事本打开一个空 index.txt,将前面网页中提到的index.php 的内容拷贝进去,并修改其中的:
$passwdfile="E:\svn\config\htpasswd.conf";
$command='"D:\Program Files\Apache Group\Apache2\bin\htpasswd.exe" -b '.$passwdfile." ".$username." ".$newpass;

改成 fedora-7.0 相应的内容即可:
$passwdfile="/var/www/svn/repos/conf/svnusers.conf";
$command='"/usr/bin/htpasswd" -b '.$passwdfile." ".$username." ".$newpass;
保存后,将名字改成 index.php,并上传到服务器上,放到“/var/www/svn/repos/chpass/”目录下,然后将httpd 服务重启即可。



问题:
用“http://ip/changepassword”登录时,按提示输入了用户名密码后,就看不到页面内容了,后来将网页的编码改成“GB2312”或“GB18030”后就可以正常显示,想到 index.php 的编码应该是 GB*** 的,所以不能正常显示。

用 GB2UTF8.exe 把 index.php 的编码改成 UTF-8 后,就可以了。





2010.4.11 补充______________________________________________________________

今天在fedora-12上安装 svn+apache,下面是安装过程遇到的问题的记录,以作备忘 :)

主要参考的还是原来的教程,“使用mod_dav_svn访问Subversion仓库”:
http://www.uml.org.cn/pzgl/200908078.asp


1、
首先遇到没有安装 mod_dav_svn,于是想从光驱里看看有没有,可是半天没挂载上,不知道为什么,原因以后再查。

再就是去网络上找,还是在“http://rpm.pbone.net/”找到的,mod_dav_svn-1.6.9-1.fc12.i686.rpm,下载下来后安装上,这一关就过了。


2、
第二个问题是在“/var/www/svn/”下用“svnadmin create repos” 创建版本库时,报错:
[root@localhost svn]# svnadmin create repos
svnadmin: SQLite 编译为 3.6.20,但是运行于 3.6.17

上网找了找,在下面这里找到线索,原因可能是更新sqlite3不彻底。
http://forums.fedoraforum.org/showthread.php?p=1335520&language=zh-TW

运行了“yum install sqlite”也就可以了。

刚在服务器也试过了,奇怪的是那上面也有这个报错,难道那里也曾经升级过但没完成?
这个问题原因有待确定。


3、
遇到一个问题,是访问“http://192.168.120.169/repos”时,不需要输入认证信息,明明在“etc/httpd/conf.d/subversion.conf”已经写明了如下:

DAV svn
SVNPath /var/www/svn/repos


AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /var/www/svn/conf/passwd
Require valid-user

AuthzSVNAccessFile /var/www/svn/conf/authz



其中注明了“AuthUserFile /var/www/svn/conf/passwd”和“AuthzSVNAccessFile /var/www/svn/conf/authz”,但却不需要输入认证信息就可以访问。

细比较了一下原来在一台服务器上已经配好的svn+apache服务器,发现需要把 LimitExcept 这个选项屏蔽掉,才能正常的来对访问使用认证 ^_^

正确的“etc/httpd/conf.d/subversion.conf” 文件见下面遇到的第4个问题里提到的。


4、
在配置授权文件 authz 的时候遇到一个问题,是怎么写授权路径的错误。

如我在“/etc/httpd/conf.d/subversion.conf”里是这样的写的:

DAV svn
SVNPath /var/www/svn/repos

AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /var/www/svn/conf/passwd
Require valid-user

AuthzSVNAccessFile /var/www/svn/conf/authz


在“/var/www/svn/conf/passwd” 里创建了一个用户 user1
[root@localhost svn]# htpasswd -c /var/www/svn/conf/passwd user1
New password:
Re-type new password:
Adding password for user user1
[root@localhost svn]#


然后在“/var/www/svn/conf/authz” 里就必须要这样写:
[groups]
admin = user1

[repos:/] # 这里出错了,写了[/],也写了[/repos],都错了,行首的写法是唯一正确的:)
@admin = rw
* = rw
[root@localhost svn]#


5、
又遇到一个问题,蛮特别的,记录一下。

在“/etc/httpd/conf.d/subversion.conf” 里如果用“SVNParentPath /var/www/svn”,后面的配置都与问题4 正确的方式一样的,那么登录“http://192.168.120.169/repos”,输入正确的认证信息后会有“Forbidden”的出错提示。

改成“SVNPath /var/www/svn/repos”就一切正常了 :)



6、
遇到一个搞笑的问题。
访问“http://192.168.120.169/”时,提示:
svn: 方法 OPTIONS 失败于 “http://192.168.120.169”: 200 OK (http://192.168.120.169)

搞笑的是我还在那时想了半天,回到自己位置上才明白犯了个白痴错误。

就当一个可能遇到的问题,记录下来吧,以作备忘 :)
0 0
原创粉丝点击