SVN使用经验心得
SVN使用经验心得
1、如果已经有人lock了一个文件,但另外一个人需要编辑此文件,有两个选择,一个是由管理员来解除锁定,另外一个是在get
lock选项中有个steal the locks,选择后,即可以编辑该文件
2、SVN的版本概念是针对目录而非文件,即使只更新了一个文件,那么,整体的版本也需要加1
3、推荐使用目录树为
/repos/trunk 用来保存主线,所有的code都存放在这个目录中
/repos/branches
用来保存目录分支,OEM、新功能、设计方案调整,都有可能需要创建分支目录
/repos/tags
用来保存标签拷贝,文档宝的阶段性成果可以打个标签存放到此目录下
4、SVN的上传和更新是异步的,可以分开操作,而不用担心在update的同时把自己不成熟的代码commit从而影响别人的工作。
5、.svn这个目录是用来管理目录与服务器的同步情况和来管理工作copy的,如果不小心删除了,可以把该目录整个删掉,然后返回父目录,并使用update,则会从服务器上重新下载该目录并包含新的.svn
6、SVN常用操作
a、保持客户端和服务器端的一致,从服务器上更新文件,update
b、对客户端文件的增、删、改、剪切,add,delete,copy,move
c、状态比较 status,diff
d、取消对服务器上文件的修改,revert
e、合并别人的修改(后更新的人需要做这个操作)update,resolved
f、客户端修改的文件更新到服务器上,commit
7、查询版本,不单单可以通过版本号查询,也可以通过关键字和版本的日期来查询
注意:如果给定时间的话,查询时需要在希望的日期上加一,如要查询2008-09-02的版本,应该使用2008-09-03,因为你只给了日期而没有给指定的时间点。
8、锁定-修改-解锁方案,拷贝-修改-合并方案使用的一般原则
如果是图像文件,一般使用锁定-修改-解锁方案,因为两个不同的版本没法合并
如果是文本文件,一般使用拷贝-修改-合并方案
9、锁定文件可以所单个,也可以锁多个,可以选择一个文件夹,然后在列表中勾选。并
且,这个锁定是随时都可以解除的,选择unlock即可。
注意:
如果一旦提交了更新,那么所有的文件都将解锁,即使有部分文件可能还没有更新。
但是如果你在commit的时候,选择keep
locks,则文件还是被锁定。
10、对客户端的目录或文件可以设置属性,可以从下拉列表中选择
如svn:needs-lock,就是对指定的对象设置只读权限,只有当该对象拥有锁定的权
限后,才能对文件进行编辑,这样可以确定只有一个用户在操作该文件,避免像图像这
样的文件只能线形操作而导致另外一个人工作的浪费。
额外建议:
1、建个专门的服务器,或在现有的目录上建立个专门的目录,用来给公司成员验证SVN的不熟悉的功能和操作步骤,热热身,熟悉了使用方法后再在实际的目录上操作。毕竟,如果一旦出现了问题,需要维护的,还是你自己。
\
2、抽时间寻找一些SVN的比较工具,管理工具等使用的外置工具来辅助日常工作。
11、即使客户端的文件test.doc被重命名了hello.rtf(使用svn重命名),但它的历史纪录仍然含有重命名以前的信息,并且可以将之前的版本给提取出来。即使再新建一个test.doc也不会有混淆。(查看历史纪录的时候需要把Stop on copy/rename这个选项的复选框的勾去掉)
12、SVN的复制比较特殊,如果复制一个目录,它其实并没有完全复制目录中的所有的文件,它只是建立一个目录树的入口,你可以把它理解为一个快捷方式,即使当你的新目录中的文件有了更改,它也只是更新你修改的文件,其他文件还是原文件夹的映射,没有更改。
13、对主干和分支上文件的修改互不影响。当完成了分支上所有工作,所有的分支修改可以被拷贝回到主干。
14、对同名文件的合并可以先用svn diff查看文件的区别,然后通过svn merge功能来合并文件。
15、如果需要解决版本的冲突,会在本地目录下产生同名的三个文件,初始的版本(在比较的左边)、最终的版本(在比较的右边)、接收区别的工作拷贝(合并的目标)。通过比较来手动合并版本,如果通过比较不需要将本地的修改合并到服务器上去,则使用revert回滚。
16、手工跟踪合并:SVN并不能完全自动合并冲突,比较合适的方法是在版本提交的日志信息中说明合并的特定版本号(或是版本号的范围),这样等到合并时可以运行svn log来查看分支包含了哪些修改。这样可以帮助依序进行合并而不会进行多余的合并。
17、预览合并:当工作拷贝已经改变,合并会针对存在的那一个文件,这时运行revert不会恢复在本地的修改,两部分的修改无法识别出来。解决这个问题的简单的方法就是使用diff来预览变化部分,通过显示合并时的状态信息,得到合并之后的“整体”预览。
18、svn diff和svn merge的区别:
将test.doc版本100重命名为ceshi.doc,同时新建一个文件test.doc为版本102。
这样区别就出来了:
svn
diff命令忽略祖先,diff命令只是单纯地比较两条路经下的两个文件。
svn
merge是比较两个对象,会注意到版本100和版本102的test.doc两个文件是不关联的。
19、SVN并没有真正意义上的重命名,move命令只是copy、delete两个命令的组合。
20、找回删除的项目:即使删除了文件或目录,SVN的信息从不丢失,只是从当前的HEAD版本消失了,但仍然存在于历史的早期版本。只要通过SVN的log来查看所有改变的每个项目的版本,找出你删除文件或目录的那个版本。
21、将所有的开发代码存放在trunk上。
常用分支模式:
a、发布分支:在代码发展到一定阶段,建立发布分支,将当前的一个版本取出来,拷贝到branches目录下,进行全面严酷的测试,如发现BUG则在当前版本进行修复,并同步更新trunk中的BUG,经测试完成后,将文件拷贝到tags目录中发布,并提交给客户。
b、特性分支:如果需要作复杂的修改,会影响到trunk代码的稳定性,则建议建立一个特性分支,等特性稳定之后,再和truck主干合并
22、标签TAG:它是某个项目,某个时间的一个快照,这个术语很常见,每次提交一个修订版本其实都是一个精确的快照。
23、经典常用的版本库布局:
如果是单个项目的,建议使用如下格式
/trunk 保存项目开发的主线。
/branches 保存项目的各种开发分支。
/tags 保存项目的标签,也就是创建后永远不会修改的分支,例如发布release版本。
如果是多个项目在同一个版本库中,建议使用如下格式
/RigTMS/trunk
/RigTMS/branches
/RigTMS/tags
/DocProtect/trunk
/DocProtect/branches
/DocProtect/tags
注释**个人比较倾向于使用第一种方式,一个是格式比较简单,终端用户不容易引起混淆,二是版本库的权限控制比较简单,三是以后的备份/还原相对易行
24、SVN的数据存储格式有Berkeley DB和FSFS。我们现在所使用的版本默认为FSFS格式的数据存储。
25、SVN自带工具
(要使用这些工具可以在命令行模式下输入svnadmin help、svnlook help等指令即可)
Svnadmin:提供创建SVN版本库的功能,还可以用来维护这些版本库。
Svnlook:用来查看版本库中不同的修订版本和事物(它不会改变版本的内容)。
Svndumpfilter:可以简单快速的作为SVN版本库历史的以路经为基础的过滤器。
Svnsync:将一个版本库的历史转移到另外一个上。特点是可以远程操作(“源”、“目标”版本库以及svnsysnc程序可以在不同的计算机上使用。)
26、SVN节约磁盘空间的主要方法:
1、采用增量化技术,对两组数据,只记录其中的一组,另外一组只是存放与第一组有差别的部分。
2、由于客户端和服务器网络异常,或客户端svn进程异常中止,都可能导致文件提交的事务失败,可以删除意外中止的事务。可以使用$svnadmin lstxns myrepos来清除。
27、删除不使用的Berkeley DB日志文件
Svnadmin list –unused –dblogs /path/to/repos
Rm
‘svnadmin list –unused-dblogs /path/to/repos’