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' 或 '?')
根据不同需求进行选择操作,习惯的操作是先显示文件冲突的地方:
当选择‘p’时结果如下:
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