文章目录
- 1. svn服务器搭建,
- 2. svn help/版本/username
- 3. svn clean
- 4. svn co svn://192.168.2.100/XXX
- 5. svn commit -m "xxxxxxxx"
- 6. svn cp
- 7. svn delete
- 8. svn diff
- 9. svn info
- 10. svn list(我一般使用svn ls)查看当前目录下的svn文件。类似linux的ls命令。
- 11. svn log
- 12. svn mv
- 13. svn revert
- 14. svn st的某些状态不理解意思。
- 15. svn up时遇到冲突,怎么办?
- 16. 常见问题
- 16.1. 本地代码更新较多,存在bug,暂时不能上传。但是要求继续使用代码版本维护。
- 16.2. 有些人不规范,利用mv指令修改名称,导致错误。
- 16.3.代码提交不整洁
- 16.4.项目不同阶段,会设置不同用户权限
- 16.5.在我的工程里有一个文件,每个人都必须改变它,但是我不希望他们本地的修改被提交,如何让'svn commit'忽略这个文件?
- 16.6.sim_gpu的仿真环境,已经执行过,里面有很多临时文件,怎么拷贝一个新的干净的最新svn版本的sim_gpu
- 16.7.svn服务器推荐的目录布局(特指单一项目的svn维护)
- 16.8.svn的文件内容尽量精简
- 16.9. svn怎么忽略特定文件或者文件夹
- 16.20 删除文件或者目录
- 16.20. 如何更换同名的目录或者链接符号
- svn相对git的缺点
svn大多数人都会,有些命令是可以深入的。
1. svn服务器搭建,
可以参考/home1/qilei/SVN/create_svn_cangku.sh脚本。基本说来是三步。
1.1 建立svn。svnadmin create
1.2 配置svn。 conf
1.3 启动svnserve服务。svnserve -d -r ./
举例
项目名称叫MyProject
- svnadmin create MyProject
- 编辑./MyProject/conf/svnserve.conf文件,目的是设置基本的svn参数
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = welcom to MyProject - 编辑./MyProject/conf/authz文件,目的是增加用户名及其可读写权限。
[/]
jones = rw
admin = rw
qilei = rw
- = r
- 编辑./MyProject/conf/passwd文件,目的是设置用户的访问密码
[users]
jones = jones123
admin = admin123
qilei = qilei123 - 在MyProject的上一级目录下,执行命令svnserve -d -r ./;目的是启动svn服务器服务。
其中,anon-access = none和* = r;这两个地方,要注意按部就班的写吧。因为如果依赖默认的话,anon-access = read和* = r,看网上的说法,老版本的svn是有bug的(不过经过实践,svn 1.7.14版本是没有这个bug的)。
2. svn help/版本/username
2.1 svn help command
有需求,基本思路,从内容里查找自己有用的信息。
2.2 -r 600
指定版本号600
2.3 -r 600:611
指定版本号600到611的范围。
2.4 -r 600:HEAD
指定版本号从600开始到最新版本
2.5 svn --username qilei --password 123456
默认用户名密码是缓存到本地的。大都遇到这样的情况,liaojian有一个与我负责IP相关的bug,经debug后,认定要提交svn ci,如果不添加参数–username qilei,就使用的liaojian本地缓存的用户名提交代码,造成svn log的混乱。如果添加参数–username qilei --password 123456,就会污染liaojian本地用户名密码的缓存
3. svn clean
主要是解决svn lock问题。
4. svn co svn://192.168.2.100/XXX
4.1 checkout版本162
svn co svn://192.168.2.100/XXX -r 162
4.2 只checkout XXX这一层,内部目录不checkout。
svn co svn://192.168.2.100/XXX -N
4.3 只checkout文件夹XXX/simulation
svn co svn://192.168.2.100/XXX/simulation
4.4 只checkout文件,比如netlist快捷符。(svn只能checkout某个文件夹)
svn co svn://192.168.2.100/XXX -N
4.5 checkout到本地并改名为qilei目录
svn co svn://192.168.2.100/XXX -N qilei
5. svn commit -m “xxxxxxxx”
如果换行,可以
svn commit -m “xxxxxxxx
yyyyyy
zzzz”
6. svn cp
一般用于svn 分支使用。这个cp是极好的,因为它是廉价复制,对空间消耗极小;本地看起来是真正的拷贝,服务器上基本没有任何空间增加。
svn的delete和copy都不是普通的删除和复制
svn的delete只是做了个标记,在客户端获取新版本时不出现这些被删除的文件,而文件本身在服务器端仍然是存在的,而且可以通过更新到原来的某个版本找回这些文件
svn的copy也只是在服务器端做个类似指针的映射,在服务器端并不重复存储这些文件,对服务器端的存储空间消耗极小
svn的分支和标签用的都是svn copy
7. svn delete
删除目录或者文件,
然后svn ci提交。
8. svn diff
8.1 svn diff aaaa.v -r 611
与611版本的aaaa.v做diff比较。
8.2 svn diff可以支持gvimdiff的。
但是会影响整个主目录下的svn diff;有时候脚本命令会用到svn diff。建议,还是保留svn diff。
9. svn info
显示svn的信息,包含版本号、URL、last changed author等。
与svn switch URL经常配套使用。确认当前svn的branch。
经常用svn info命令,解决很多不常见的svn操作错误。这个命令,值得拥有。
10. svn list(我一般使用svn ls)查看当前目录下的svn文件。类似linux的ls命令。
11. svn log
11.1 svn log -v
打印日志,包含代码改动的文件名列表。
11.2 svn log -v -r 611::600
611版本与600版本之间的版本改动记录。
12. svn mv
重命名
svn mv XXX/design/IP XXX/design/IP_OLD
配合svn ci XXX/design/IP -m “update IP”,就可以提交新IP代码了。
13. svn revert
举例,如果svn add aaaa.v之后,发现aaaa.v没有必要提交。
可以使用svn revert aaaa.v,取消掉svn add aaaa.v命令。
类似的svn delete aaaa.v,也可以。
svn revert目录,要加入–depth参数,比如
svn revert XXX --depth infinity
14. svn st的某些状态不理解意思。
svn help st已有详细描述。
15. svn up时遇到冲突,怎么办?
$ svn update
U INSTALL
G README
Conflict discovered in ‘bar.c’.
Select: § postpone, (df) diff-full, (e) edit,
(h) help for more options:
个人认为,直接ctrl+c,然后对bar.c进行svn st检查冲突原因。不需要明白select的各命令意义。
善用gvimdiff,可以写个简单脚本,实现一个gvimdiff版本的svn diff操作。
16. 常见问题
16.1. 本地代码更新较多,存在bug,暂时不能上传。但是要求继续使用代码版本维护。
在svn中标签和分支都源于copy命令。
3个约定俗成的目录:
trunk:主干
branches:分支
tags:标签
推荐svn层次分为2个大目录
svn_name/trunk:主干。公用的稳定版本
svn checkout svn://192.168.2.100/svn_name/trunk
svn_name/branches:分支目录
发布分支:
svn cp svn://192.168.2.100/svn_name/trunk/project_name svn://192.168.2.100/svn_name/branches/project_name -m "创建用于本地的分支"
切换分支:
主干版本:
svn switch svn://192.168.2.100/svn_name/trunk/project_name
分支版本:
svn switch svn://192.168.2.100/svn_name/branches/project_name
注意:稳定版和开发版,不要搞错了。以后再开发版进行操作。
本地代码经过验证成功后,通过merge操作,提交至最新的svn服务器。
合并分支需要两个步骤:
合并操作
首先,切换到需要merge后提交的版本,比如主干版本或者分支版本,一般是分支版本的代码merge到主干版本。
svn switch svn://192.168.2.100/svn_name/trunk/project_name
svn merge -r 33:HEAD svn://192.168.2.100/svn_name/branches/project_name
解决merge问题后,最后提交
svn ci
参考文档:
SVN中Branch的创建与合并 - 黄博文 - 博客园
http://www.cnblogs.com/huang0925/p/3254243.html
16.2. 有些人不规范,利用mv指令修改名称,导致错误。
例如
svn add yyy
svn提示:yyy已经在版本控制里。
原因解析:版本控制里,其实并没有yyy,但是svn info yyy,会发现yyy本身的svn URL是另外一个名字(例如xxx),而且这个xxx名字文件确实是在版本控制里。
还有一种可能的原因,是yyy目录里有.svn。
总之,svn info yyy,只有说明yyy不是一个版本资源,就可以执行后续svn add yyy 了。
解决办法:svn info yyy;svn delete xxx;然后svn add yyy
16.3.代码提交不整洁
不相关的文件,甚至临时文件都做了上传。
16.4.项目不同阶段,会设置不同用户权限
16.5.在我的工程里有一个文件,每个人都必须改变它,但是我不希望他们本地的修改被提交,如何让’svn commit’忽略这个文件?
答案是:不要将文件纳入版本控制,而是将文件的模板纳入版本控制,例如“file.tmpl”。
然后,在初始化的‘svn checkout’之后,让你的用户(或你的构建系统)执行通过普通的操作系统复制将文件修改为正确的文件名,文件未版本化,所以绝不会提交。并且如果你希望,你可以将文件加入到父目录的svn:ignore属性中,这样它就不会在‘svn status’命令中显示‘?’。
16.6.sim_gpu的仿真环境,已经执行过,里面有很多临时文件,怎么拷贝一个新的干净的最新svn版本的sim_gpu
暂时想到的办法是,svn co svn://192.168.2.100/xxx/sim_gpu sim_gpu2
16.7.svn服务器推荐的目录布局(特指单一项目的svn维护)
结合svn branch和tag去理解。
/XXX_project
trunk/
design/
simualtion
tags/
formal_v1.0/
branches/
branch_v0.01/
design/
simualtion
branch_v0.02/
branch_v0.03/
16.8.svn的文件内容尽量精简
svn的目录布局,增加一些common目录
16.9. svn怎么忽略特定文件或者文件夹
svn propset svn:global-ignore "worklib" .
svn操作会忽略当前目录下的worklib文件或者文件夹。
注意后面的点符号,表示当前路径;这是svn propset语法要求的。
svn ignore忽略文件夹的内容
svn propset svn:global-ignore '*' worklib
查看当前忽略的文件或者文件夹?
解答:svn propget svn:global-ignore
16.20 删除文件或者目录
svn delete
,然后svn ci -m ""
;
16.20. 如何更换同名的目录或者链接符号
svn mv
,然后svn ci -m ""
。
svn相对git的缺点
- svn分服务端和客户端。如果服务端数据挂了,依赖客户端是无法获取svn log信息的。
- svn做本地代码维护时,也需要提交版本给服务端。