前言
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。svn服务器有2种运行方式:独立服务器和借助apache运行。svn存储版本数据也有2种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
- 包含绝大部分CVS的功能
- 目录的版本化
- 基于版本的复制,删除和重命名
- 自由的版本化元数据操作
- 混合追踪
- 文件锁
- apache网络服务的支持,基于WebDAV/DeltaV协议
- 可执行的标签
- 独立进程模式
- 一个只读的存储镜像
常用命令
备注:Mac svn命令linux同样适用,TortoiseSVN命令行也可以使用。
1、将文件checkout到本地目录
|
|
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
2、往版本库中添加新的文件或文件夹
|
|
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
3、将改动的文件提交到版本库
|
|
例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
4、加锁/解锁
|
|
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某个版本
|
|
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态
|
|
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除文件
|
|
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、查看日志
|
|
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息
|
|
例如:svn info test.php
10、比较差异
|
|
例如:svn diff test.php
例如:svn diff -r 200:201 test.php
简写:svn di
11、将两个版本之间的差异合并到当前文件
|
|
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、SVN 帮助
|
|
例如:svn help ci
13、版本库下的文件和目录列表
|
|
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、创建纳入版本控制下的新目录
|
|
用法:
- 1、mkdir PATH…
- 2、mkdir URL…
创建版本控制的目录。 - 1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。
- 2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改
|
|
用法: revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录。
16、代码库URL变更
|
|
用法:
- 1、switch URL [PATH]
- 2、switch –relocate FROM TO [PATH…]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。
17、解决冲突
|
|
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。
|
|
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)
常见问题
Aborting commit: ‘XXXXXXXX’remains in conflict错误
今天在提交项目文件到本地SVN时提示错误如下:过期:”global.php“在事务”21-1“,You have to update your working copy first.运行update更新后再次提交又出现如下错误:
svn: Commit failed (details follow):svn: Aborting commit: ‘global.php’ remains in conflict,查了一下SVN的手册才知道原来是多个版本之间遇到冲突。此时你需要解决冲突(合并别人的修改)。
举一个例子,Sally修改了sandwich.txt,Harry刚刚改变了他的本地拷贝中的这个文件并且提交到服务器,Sally在提交之前更新它的工作拷贝得到了冲突:
$ svn update C sandwich.txt Updated to revision 2.
$ ls -1 sandwich.txt sandwich.txt.mine sandwich.txt.r1 sandwich.txt.r2
在这种情况下,Subversion不会允许你提交sandwich.txt,直到你的三个临时文件被删掉。
如果你遇到冲突,三件事你可以选择:
- “手动”合并冲突文本(检查和修改文件中的冲突标志)。
- 用某一个临时文件覆盖你的工作文件。
- 运行svn revert
来放弃所有的修改。
一旦你解决了冲突,你需要通过命令svn resolved让Subversion知道,这样就会删除三个临时文件,Subversion就不会认为这个文件是在冲突状态了。
例如:
$ svn resolved sandwich.txt
$ svn commit -m “Go ahead and use my sandwich, discarding Sally’s edits.
注意:如果你修改冲突时感到混乱,你可以参考subversion生成的三个文件—包括你未作更新的文件。你也可以使用第三方的合并工具检验这三个文件。
拷贝覆盖你的工作文件
如果你只是希望取消你的修改,你可以仅仅拷贝Subversion为你生成的文件替换你的工作拷贝:
使用svn revert:如果你得到冲突,经过检查你决定取消自己的修改并且重新编辑,你可以恢复你的修改:
注意:当你恢复一个冲突的文件时,不需要再运行svn resolved。
现在我们准备好提交修改了,注意svn resolved不像我们本章学过的其他命令一样需要参数,在任何你认为解决了冲突的时候,只需要小心运行svn resolved,一旦删除了临时文件,Subversion会让你提交这文件,即使文件中还存在冲突标记。
提交修改:
svn commit命令发送所有的修改到版本库,当你提交修改时,你需要提供一些描述修改的日志信息,你的信息会附到这个修订版本上,如果信息很简短,你可以在命令行中使用–message(-m)选项.
版本库不知道也不关心你的修改作为一个整体是否有意义,它只检查是否有其他人修改了同一个文件,如果别人已经这样做了,你的整个提交会失败,并且提示你一个或多个文件已经过时了.
其他问题
问题1:’.’ is not a working copy. Can’t open file ‘.svn/entries’: 系统找不到指定的路径。
解答:原因是输入的访问路径不正确,如svn://192.168.6.200/如果最后少写了“/”,就会出现这种错误提示。
问题2:将文件checkout之后,没有出现SVN的图标,是怎么回事?
解答:有些时候在客户端Checkout文件后,SVN的系统图标也会不显示,可以执行一下“Clean up”,就会出现SVN的系统图标。
问题3:为什么添加的文件,别人看不到,版本库里也没有?
解答:最可能的原因是,你只是执行了“Add”而没有“Commit”,这样只是在本地注明某个文件是预定要增加的,而没有实际添加到版本库中,要添加到版本库必须执行“Commit”。删除文件也是一样。
问题4:“Commit failed。……You have to update your working copy first” 提交失败,需要首先执行更新操作。
解答:多人同时修改同一文件,在提交前其他人已经抢先提交到SVN服务器中,导致该错误;解决方法:对工作复本中的文件进行更新即可。
问题5:更新时提示文件发生冲突:“One or more files are not a conflicted state。”
解答:多人同时修改同一文件的同一部分,SVN无法自动进行合并,会导致该错误;解决方法:对工作复本中的文件和服务器的文件进行比较,手工合并即可。
问题6:“Commit failed;File already exists”提交失败,文件已存在。**
解答:版本管理系统在改变你的计算机上的工作副本时,是非常的小心的。在做任何事情之前,它都尽可能把您的意图写到你的计算机上的日志文件中去。但如果偶然地操作中断了(例如:突然停电了,您的计算机死机了),那么日志文件记录就可能同您最后的工作状态不一致。一种建议解决途径:先把要提交的东西拷出来放到其它目录,再更新本地文件,然后把拷出来的文件重新放回去提交。
问题7:Working copy’’locked. Please execute the ’Clean up’command.**
解答:Subversion客户端在提交内容之前会在本地的工作拷贝写日志,防止其他客户端再次作操作,如果这个提交过程中发生错误,就会存在未清理的日志,解决这个问题之需要执行“清理”操作,整理你的计算机上的工作副本,清理错误的日志记录,使您可以继续操作。
问题8:执行clean up时,出现错误“Subversion reported an error while doing a cleanup!” ‘‘ is not a working copy directory ”**
解答:遇到这种情况,先删除隐藏文件夹.svn中的tmp下面的临时文件,再执行clean up。
问题9:因为仓库与目录很多,使用TSVN每次选择目录URL of repository有很多地址,如何才清除呢?像清除浏览器中的历史那样,用什么方法呢?
解答:右键->TortoiseSVN->Settings->Saved Data,就可以清除你想要的东西了,包括URL、log、窗口大小、密码缓存等。
问题10:在SVN中选中一个目录show log时,出现了某些版本只显示版本号和(no date),没有其他信息,什么原因引起的?
解答:出现了(no date)的revision,为其他人修改了你所没有权限访问的某个目录下的文件。
问题11:Attempted to lock an already-locked dir is not under version control
解答:I deleted the log file in the .svn directory (I also deleted the offending file in .svn/props-base)
Then did a cleanup.. Then resumed my update.
问题12:svn: warning: ‘xxxxx’ is already under version control 解决办法?
解答:只添加相应目录到SVN,但不添加目录下的文件:
原因: 很可能是 .svn 隐藏目录版本信息被修改了
解决办法:
删除uploads目录下的.svn目录及下面的文件(保留uploads目录的.svn)