在服务器上启动SVN服务
sudo svnserve -d -r /home/svnuser/
$ sudo update-alternatives --config editor
一、SVN安装
1.安装包
$ sudo apt-get install subversion
2.添加svn管理用户及subversion组
$ sudo adduser svnuser
$ sudo addgroup subversion
$ sudo addgroup svnuser subversion
3.创建项目目录
$ sudo mkdir /home/svn
$ cd /home/svn
$ sudo mkdir fitness
$ sudo chown -R root:subversion fitness
$ sudo chmod -R g+rws fitness
4.创建SVN文件仓库
$ sudo svnadmin create /home/svn/fitness
5.访问方式及项目导入:
$ svn co file:///home/svn/fitness
或者
$ svn co file://localhost/home/svn/fitness
* 注意:
如果您并不确定主机的名称,您必须使用三个斜杠(///),而如果您指定了主机的名称,则您必须使用两个斜杠(//).
//–下面的命令用于将项目导入到SVN 文件仓库:
$ svn import -m “New import” /home/svn/fitness file:///home/svnuser/src/fitness
一定要注明导入信息
//————————–//
6.访问权限设置
修改 /home/svn/fitness/conf目录下:
svnserve.conf 、passwd 、authz三个文件,行最前端不允许有空格
//–编辑svnserve.conf文件,把如下两行取消注释
password-db = password
authz-db = authz
//补充说明
# [general]
anon-access = read
auth-access = write
password-db = passwd
其中 anon-access 和 auth-access 分别为匿名和有权限用户的权限,默认给匿名用户只读的权限,但如果想拒绝匿名用户的访问,只需把 read 改成 none 就能达到目的。
//–编辑/home/svnuser/etc/passwd 如下:
[users]
mirze = 123456
test1 = 123456
test2 = 123456
//–编辑/home/svnuser/etc/authz如下
[groups]
admin = mirze,test1
test = test2
[/]
@admin=rw
*=r
这里设置了三个用户mirze,test1,test2密码都是123456
其中mirze和test1属于admin组,有读和写的权限,test2属于test组只有读的权限
sudo chmod -R 777 db
7.启动SVN服务
svnserve -d -r /home/svn
描述说明:
-d 表示svnserver以“守护”进程模式运行
-r 指定文件系统的根位置(版本库的根目录),这样客户端不用输入全路径,就可以访问版本库
如: svn://192.168.12.118/fitness
killall svnserve 删除所有svnserver,以使新添加
这时SVN安装就完成了.
局域网访问方式:
例如:svn checkout svn://192.168.12.118/fitness –-username mirze –-password 123456 /var/www/fitness
———————————————————————–
二、HTTP:// [apache]
1.安装包 [已安装subversion]
$ sudo apt-get install libapache2-svn
创建版本仓库:
sudo svnadmin create /目录地址
目录地址必须存在,这个就是保存版本仓库的地方,不同的版本仓库创建不同的文件夹即可,比如:
sudo svnadmin create /home/svn/project
本来/home/svn/project这个目录下什么都没有,执行下面的命令之后再去看一下,多出一些文件和文件夹,我们需要操作的是conf这个文件夹,这个文件夹下有一个文件,叫做passwd,用来存放用户名和密码。
然后把这个版本仓库目录授权给apache读写:
sudo chown -R www-data:www-data /目录地址
然后来到打开apache配置文件:
sudo gedit /etc/apache2/mods-available/dav_svn.conf
加入如下内容:
<Location /project>
DAV svn
SVNPath /home/svn/project
AuthType Basic
AuthName “myproject subversion repository”
AuthUserFile /home/svn/project/conf/passwd
#<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
#</LimitExcept>
</Location>
location说的是访问地址,比如上述地址,访问的时候就是
http://127.0.0.1/project
其中有两行被注释掉了,以保证每次都需要用户名密码。
最后一步就是创建访问用户了,建议将用户名密码文件存放在当前版本仓库下conf文件夹下,这样版本仓库多的时候无至于太乱。
因为conf文件夹下已经存在passwd文件了,所以直接添加用户:
sudo htpasswd -c /home/svn/project/conf/passwd test
然后输入两遍密码,laoyang这个用户就创建好了。
打开/home/svn/project/conf/passwd这个文件,会开到形如如下形式的文本:
test:WEd.83H.gealA //后面是加密后的密码。
创建以后,再次需要往别的版本仓库添加这个用户,直接把这一行复制过去就可以了。
重启apache就可以了。
sudo /etc/init.d/apache2 restart
若想创建了一个文件夹,并且把它加入版本控制,但忽略文件夹中的所有文件的内容:
$ svn mkdir spool
$ svn add spool
$ svn commit -m “Adding ’spool’”
$ svn propset svn:ignore ‘*’ spool
$ svn ci -m ‘Adding “spool” and ignoring its contents.’
若想创建一个文件夹,但不加入版本控制,即忽略这个文件夹:
$ mkdir spool
$ svn propset svn:ignore ’spool’ .
$ svn ci -m ‘Ignoring a directory called “spool”.’
若已经创建了文件夹,并加入了版本控制,现在想忽略这个文件夹,但要保持文件夹的内容:
$ svn export spool spool-tmp
$ svn rm spool
$ svn ci -m ‘Removing inadvertently added directory “spool”.’
$ mv spool-tmp spool
$ svn propset svn:ignore ’spool’ .
$ svn ci -m ‘Ignoring a directory called “spool”.’
若要忽略文件夹里的某几个文件
$ svn mkdir spool
$ svn add spool
$ svn commit -m “Adding ’spool’”
gvim .svnignore
每种要忽略的文件加一行,如:
.svnignore
*.pyc
*.cash
test.php
然后
svn propset svn:ignore -F .svnignore .
svn status
最后一种方法中的最后那个目录很重要。.svnignore里定义的内容只能是当前目录,不能是多层目录,对于要定义多层目录里的文件忽略,可以先 写好.svnignore,然后svn propset svn:ignore -F .svnignore [所要操作的目录],这样就起作用了
一、搭建 Subversion 服务器
1、首先需要安装 subversion 这个软件:
sudo apt-get install subversion
2、在 /home/nicky 下建立一个 repo,名称为 testproject:
svnadmin create /home/nicky/testproject
3、然后把 /fun/theme 目录下的内容导入到这个 repo 中:
svn import -m "" /fun/theme file:///home/nicky/testproject
4、最后给这个 repo 建立一个 svn 自带的 svnserve:
svnserve -d -r /home/nicky/testprojec
二、使用 Subversion
1、你可以使用下面的命令来获得一个 wc,如把它取名为 projecout。
svn checkout svn://127.0.0.1/ projecout
或者简写为:
svn co svn://127.0.0.1/ projecout
2、如果需要将修改从 wc 中发送到 repo。
先到 wc 所在目录,然后使用下面的命令将修改发送到 repo:
svn commit -m "note"
三、常用命令:
取出指定版本,如取出版本 2:
svn checkout --revision 2 svn://....
显示提交日志信息:
svn log
显示库中的最新信息:
svn log --revision HEAD
四、设定用户的验证和相应的权限。
现在我们先建立一个叫 project1 的 repo,然后转到 project1中:
svnadmin create d:\svnprojects\project1
cd d:\svnprojects\project1
project1 目录下有一堆目录,进入 conf 并打开 svnserve.conf 这个文件,找到以下几行,并把前面的注解符号 ‘#’ 去掉,注意千万在每行的前面别留任何空格。
anon-access = read
auth-access = write
password-db = passwd
其中 anon-access 和 auth-access 分别为匿名和有权限用户的权限,默认给匿名用户只读的权限,这很好,我们不需要改它们。但如果想拒绝匿名用户的访问,只需把 read 改成 none 就能达到目的。password-db 后的 passwd 则为定义用户名及密码的文件路径。这个文件默认跟 snvserve.conf 在同一个目录,下面看看怎么配置 passwd 中的内容。
[user]
# harry = harryssecret
# sally = sallyssecret
harry 和 sally 这两行分别定义了可以对 repo 进行写入的用户的用户名和密码。我们可以在下面加上自己的用户名和密码,比如
testsvn = tester
这样就给了用户 testsvn 往 repo 中写的权限。存盘退出后,svn 服务器就算正式可以运行了!把所有需要管理的项目都放在 d:\svnprojects 这个目录下,像正常那样用 svnadmin create 命令建立 repo,如果要 checkout repo,则在命令行中输入:
svn checkout svn://192.168.0.1/project1
如果要 commit 刚需要输入刚才设置好的用户名和密码:
svn commit -m "we are commiting changes!" --username testsvn --password tester
附:
清理和删除svn信息
svn, 删除svn信息是根据文件夹里面的 .svn 文件夹保存相关配置的,删除此文件夹即可去掉svn信息:
linux下: find . -type d -name ".svn"|xargs rm -rf
复制代码或 find . -type d -iname ".svn" -exec rm -rf {} \;
复制代码windows下:
1 复制项目文件夹,跳过隐藏文件(.svn一般是设置为隐藏,xcopy/? 可以看到各种参数) xcopy project_dir project_dir_1 /s /i
复制代码2 删除文件夹里的 .svn,有些转载写的是 %%a,那是错误的 for /r ./ %a in (./) do @if exist "%a\.svn" rd /s /q "%a\.svn"
复制代码3 注册表添加右键操作
Jon Galloway提供了一段注册表代码,可以将”Delete SVN Folders”命名增加到资源管理器的右键上,这样,鼠标点两下就能把选中目录下的所有.svn目录干掉了。Works just great!
代码为: Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""
复制代码将这段代码保存为一个.reg文件,双击确认导入注册表即可。
svn propset svn:ignore笔记
svn:ignore纠结的那个纠结啊,先纠结怎么用,而后纠结递归,在而后纠结怎么让已经在版本控制中的目录ignore,曲折啊!
写点心得吧:
新创建的目录,不在版本控制中的直接propset svn:ignore就行
创建了一个文件夹,并且把它加入版本控制,但忽略文件夹中的所有文件的内容:
$ svn mkdir xxx
$ svn propset svn:ignore '*' -R xxx //*表示改目录下所有文件,但并不对子目录有效,针对子目录递归需要加-R参数
$ svn commit -m 'Adding "xxx" and ignoring its contents.'
创建一个文件夹,但不加入版本控制,即忽略这个文件夹:
$ mkdir xxx
$ svn propset svn:ignore 'xxx' xxx
$ svn commit -m 'Ignoring a directory called "xxx".'
对已经创建了文件夹,并在版本控制库中,如果想忽略这个文件夹,但要保持文件夹的内容:
$ svn export xxx xxx.bak //直接mv xxx xxx.bak也一样
$ svn del xxx
$ svn commit -m 'Removing inadvertently added directory "xxx".'
$ mv xxx.bak xxx
$ svn propset svn:ignore 'xxx' -R xxx.
$ svn commit -m 'Ignoring a directory called "xxx".'
PS:已经在版本控制中的目录直接进行propset svn:ignore是不生效的,所以需要先删除,而后再commit,然后还原本地文件之后再进行svn:ignore设置.
用svn del会从版本库中删除但是文件也被删了, 这样会造成一更新所有人的文件都被删除掉。
用带参数--keep-local可以保留本地副本, 注意别人的副本如果没有更新过也会被删除掉
svn del --keep-local config.php
delete (del, remove, rm): 从版本库中删除文件和目录。
用法: 1、delete PATH...
2、delete URL...
svn全局忽略:
,修改目录下 .subversion/config文件,取消global-ignroes的注释
global-ignores = CVS .DS_Store Thumbs.db WS_FTP.LOG _notes _vti_* *.LCK
补充记录一些之前关于svn认证时纠结心得:
首先是关于svn认证:
天下文章一大抄,一抄害苦后来人
不知道那位大侠写的文档(该文档被若干人死去活来的转,未见修复)中写的passwd文档内【users】段的格式是:
username - password (正确格式是 username = password)
用svn st查看时,常有 ? 标记的文件,其实这些文件是不要版本控制的,每次出现会干扰视线。
可以通过svn的配置文件: /etc/subversion/config
配置全局忽略: global-ignores
对个别目录和文件的忽略:
如果想对public/photos目录设置为ignores ,要对public目录进行设置: svn pe svn:ignore public
进入编辑器输入photos 保存就可以了。多个文件分隔用换行
SVN 全局忽略列表
公共过虑的文件模式
*.[Bb][Aa][Kk] *.[Dd][Bb] *.[Ll][Oo][Gg] *.[Mm][Aa][Pp] *.[Tt][Mm][Pp]
delphi 源码提交时需过虑的文件模式
*.~* *.[Dd][Dd][Pp] *.[Dd][Cc][Pp] *.stat *.tds
vc6 vs2003 vs2005 源码提交时需过虑的文件模式
*.aps *.clw *.ilk *.idb *.ncb *.opt *.obj *.plg *.pch *.pdb *.suo *.user [Dd]ebug [Rr]elease
*.o *.bin *.out *.scc
所有需过虑的文件模式
*.[Bb][Aa][Kk] *.[Dd][Bb] *.[Ll][Oo][Gg] *.[Mm][Aa][Pp] *.[Tt][Mm][Pp] *.~* *.[Dd][Dd][Pp] *.[Dd][Cc][Pp] *.stat *.tds *.aps *.clw *.ilk *.idb *.ncb *.opt *.obj *.plg *.pch *.pdb *.suo *.user [Dd]ebug [Rr]elease *.fblz *.o *.bin *.out *.scc
解决冲突:svn resolve --accept working a.txt
导出(导出一个干净的不带.svn文件夹的目录树)
svn export [-r 版本号] http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn export [-r 版本号] svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名
svn export 本地检出的(即带有.svn文件夹的)目录全路径 要导出的本地目录全路径
注:第一种从版本库导出干净工作目录树的形式是指定URL,
如果指定了修订版本号,会导出相应的版本,
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略 本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定 本地检出的目录全路径 到要导出的本地目录全路径,所有的本地修改将会保留,
但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。
例子:
svn export svn://192.168.0.3/测试工具 /home/testtools --username wzhnsc
svn export http://192.168.0.3/test/testapp --username wzhnsc
svn export /home/testapp /home/testtools
8、比较差异
svn diff 文件名
svn diff -r 修正版本号m:修正版本号n文件名
例子:
svn diff test.php<- 将修改的文件与基础版本比较
svn diff -r 200:201 test.php<- 对修正版本号200 和 修正版本号201 比较差异