Fork me on GitHub

SVN 服务器搭建

SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。

创建版本库

svnadmin create /var/svn/svnrepos

导入项目

svn import ./myproject svn://127.0.0.1:3390/myproject -m "import project" (默认端口3690)

配置authz passwd svnserve.conf

authz:文件是权限控制文件
[groups]
admin = jason,test

[test:/]
@admin = rw
test1 = rw
* = r
passwd:帐号密码文件
[users]
jason = 123
test = 123
test1 = 123
svnserve.conf:SVN服务配置文件
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = test

启动svn版本库

svnserve -d -r /var/svn/svnrepos
svnserve -d -r /var/svn/svnrepos --listen-port 3390 #如果已经有svn在运行,可以换一个端口运行

显示项目列表

svn list svn://127.0.0.1:3390/myproject

删除项目或者文件

svn delete -m "delete project" svn://127.0.0.1/pinet
svn delete -m "delete file" svn://127.0.0.1/pinet/test.php

SVN的基本操作命令

A = 已将一个文件添加到您的工作副本中。
U = 已更新您的工作副本中的一个文件。
D = 已从您的工作副本中删除一个文件。
R = 已替换您的工作副本中的一个文件。
G = 已成功合并了一个文件。
C = 一个文件已合并了必须手动解决的冲突
X =    未纳入版本控制的目录,但是与Subversion的外部定义关联,可以参考“外部定义”
? = 未纳入版本控制
! = 该项目已遗失(被非 svn 命令删除)或不完整
~ = 版本控制下的项目与其它类型的项目重名

1、svn add */file/dir  #添加文件或者文件夹,强制添加加上参数--force即可
2、svn commit -m “提交的信息” #提交代码
3、svn update                    #获取代码
4、svn revert -R 文件或者文件夹 #恢复代码
5、svn status -u              #显示更新信息,包括当前版本
6、svn info                    #显示详细信息

忽略文件或者文件夹

忽略文件夹,则当前文件夹必须在版本库内,例如:uploads文件夹信息
/uploads
/uploads/banner
/uploads/banner/aaa
/uploads/activity
/uploads/activity/bbb

uploads必须已经在版本库中
1)、现在忽略uploads下的所有文件(包括文件、文件夹)
即:svn propset svn:ignore ‘*’ /uploads
2)、现在忽略uploads下的文件夹activity
即:svn propset svn:ignore ‘activity’ /uploads
3)、svn提交错误”svn丢失了预定增加的”
解决方案:svn revert –recursive .

解决冲突

当我们提交或更新SVN文件时,经常会遇到如下冲突提示:

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

输入 ‘s’ 显示所有选项

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: s

(e)  - 在编辑器中修改合并后的文件  [edit]
(df) - 显示写入合并文件的所有改动
(r)  - 接受文件的合并版本
(dc) - 显示所有冲突 (忽略已合并版本)
(mc) - 对于所有冲突,使用我的版本 [mine-conflict]
(tc) - 对于所有冲突,使用他们的版本 [theirs-conflict]
(mf) - 整个文件使用我的版本(纵然没有冲突) [mine-full]
(tf) - 整个文件使用他们的版本 [theirs-full]
(m)  - 使用内部合并工具解决冲突
(l)  - 执行外部工具解决冲突 [launch]
(p)  - 编辑冲突推迟解决 [postpone]
(q)  - 推迟解决所有剩余的冲突
(s)  - 显示此列表(同 'h' 或 '?')

根据不同需求进行选择操作,习惯的操作是先显示文件冲突的地方:
svn冲突

当选择‘p’时结果如下:
svn冲突

a.php.mine             是冲突前自己的文件
a.php.版本号           是冲突前本地的版本文件
a.php.服务器的版本号   是冲突后服务器版本文件
冲突解决之后提交代码的时候,注意把这三个文件删除

SVN标准目录结构

myproject/
    trunk/
        pinet/
        test.php
    branches/
    tags/

1、创建分支
svn copy svn://192.168.11.110/myproject/trunk/pinet svn://192.168.11.110/myproject/branches/pinet01 -m “create new branch”
2、分支合并
假设现在Branch上fix了一系列的bug,现在我们想把针对Branch的改变同步到Trunk上:
a)切换分支:svn switch svn://192.168.11.110/myproject/trunk/pinet
b)合并:svn merge svn://192.168.11.110/myproject/branches/pinet01
c)出现冲突则解决冲突问题,之后标记解决冲突:svn resolved file.txt或者svn resolve –accept working
d)查看当前Branch中已经有那些改动已经被合并到Trunk中:
svn mergeinfo svn://192.168.11.110/pinet/branches/pinet01
e)查看Branch中那些改动还未合并:
svn mergeinfo svn://192.168.11.110/pinet/branches/pinet01 –show-revs eligible

轻轻的我走了,正如我轻轻的来