认证和授权
在此之前,我们并没有提到SVN的安全方面的东西。并非说这不重要,而是因为根据不同的配置,可能我们会有不同的认证和授权。SVN提供三种配置。我们这里不详细说明。
首先,我们是可以通过网络来访问SVN库的。那么我们就需要通过一些网络协议。SVN支持HTTP(s), SSH等协议。这些协议中各自的认证授权又有不同。
其次,SVN利用操作系统的特性来缓存密码。也就是说,我们的密码是缓存在SVN服务器上的。当然有的还可能是明文。如果不想缓存,使用 --no-auth-cache
在此,使用 --username --password选项来与服务器认证。--username 和 --password是两个全局选项,大多数的SVN命令都支持。
分支与合并
如果在某一个时刻,我们突然发现需要针对不同的需求,基于原来的代码开发一个新的东西,那么我们可能需要一个分支。
之前忘了说,我们的库中的目录布局,一般会创建两个目录,叫做Trunk 和Branches。
Trunk自然是主干,Branches 就是分支了。
首先创建分支:
$svn copy file:////repos/idp/trunk file:///epos/idp/branches/mybranch -m "shaoxin 's branches "
Commited revision 532
创建分支使用的是copy,注意这里,我们使用的是从库到库的copy,这样的速度是很快的。因为这只是一个Hard link
然后check到Working Copy
$svn checkout file://repos/idp/branches/mybranch
...
...
...
然后我们就可以在分支中大展身手了。注意,分支和主线共用一个版本历史。但是分支以后的历史,主线没有。在回头看看创建分支,很简单吧。Copy命令告诉我们,SVN的分支,其实就是一个普通目录而已。仅此而已。一个术语而已,对于分支到分支的复制,我们叫 Merging,使用svn merge来实现。
分支并非一直都这样分下去。如果我们的分支功能开发好了,那么也许主线觉得不错,那就合并过来吧。如果要合并,那么一个前提,我们要随时和主线保持同步,不然你突然重新合并分支,可能冲突就泛滥成灾了。下面说如何保证分支和主线同步。
之前说的,分支到分支的复制叫Merging,分支其实就是目录,那么目录到目录的复制就是merging,我们用svn merge,分支到主线也一样。
首先。确保自己在分支目录下。
$pwd
/home/madic/mybranch
然后开始merge吧。
$svn merge file:////repos/idp/trunk
...
...
...
同步完成,我们查看是否有冲突。
$svn status
...
...
..
如果有冲突,就解决冲突。一切OK,那我们提交
$svn commit -m "Merge lastest trunk change"
经过无数次同步,我们的分支终于不再开发了。我们也许想合并到主线。SVN叫做reintegrate
首先,更新主线
$svn update 主线目录
...
...
...
合并分支
$svn merge --reintegrate file:///repos/idp/branches/mybranch
...
...
...
提交
$svn commit -m "merge mybranche back into trunk"
...
...
...
完成合并后,分支是否要删除?
这是一个问题,但是有一点可以确定,分支不能再被使用。当然他的历史信息,是否是需要的呢?因为分支和主线的历史,一旦建立分支后,之后的历史他们是各自独立的。
如果此时我们又想念分支了,我们要在启用分支,那么很简单:
$svn delete mybranches
$svn copy trunk branch
$svn switch brances
这里 switch把我们切换到分支。Switch 是一个切换库的命令。这里我们要知道,分支实际上只是一个对主线的Hardlink,实际上我们在一个working copy,但是确实两个库同事管理。我们通过switch切换,那么我们在执行svn命令时,不指定库,默认的就是switch的那个库了。
Merge信息,我们可以通过 svn mergeinfo 来查看。
$svn mergeinfo /repos/idp/trunk
R341
R342
R343
这表示的已经合并的版本。
$svn merginfo /repos/idp/runk --show-revs eligible
R391
R392
表示还可以合并的。eligible 还可以使用merged替换,表示已经合并的。
恢复删除
如果不小心删除了某个文件,而这个文件已经不再HEAD版本了。那么我们如何恢复呢?
方法一:
$svn copy /repos/idp/remove.c@807 ./remove.c
这表示在把808版本的remove.c恢复到当前目录
$svn status
A + remove.c
这里加号表示 从历史版本恢复,而不是新加的。
增加后要提交
$svn commit -m "rescurrected remove.c from r807" remove.c
Adding remove.c
...
...
如果我们不想要remove的历史信息了。可以用第二种方法。
$svn cat /repos/idp/remove.c@807 > ./remove.c
$svn add remove.c
$svn commit remove.c -m " rescurrected remove.c from r807" remove.c
既然可以从Working Copy添加,也可以直接拷贝到库。
$svn copy /repos/idp/remove.c@807 /repos/idp/
$ svn update
A remove.c
这里,我们可以看到一个URL或者PATH后面跟着@版本号。这是因为路径和URL并不是唯一指定一个文件的,因为我们的SVN是时光机,文件也是有时间的。好比某个房子里并不是一直住着一个人,时间不同,可能住的人不同。所以,我们使用@版本号来唯一确定一个历史文件。
稀疏目录
我们都知道checkout的功能了。但是实际上checkout远远不止这些。我们可以通过各种选项,使得checkout具有更多的功能,来符合我们的实际要求。
$svn checkout URL ---depth empty|files|immediates|infinity
--depth的参数
empty 只包含目标文件或目录,不包含子目录
files 只包含目标文件和子文件
immediates 只包含目标文件及相邻的文件,目录
infinity 所有文件,目录,子目录。
同样,我们在svn update的时候,也可以这样使用。
锁机制
我们前面提到,使用SVN的一种模式 Lock-Modify-Unlock。现在我们说说SVN的锁。
SVN有三种锁的概念。
避免多用户同时提交的锁
WorkingCopy的锁,组织多个Subversion同事操作一个WoringCopy
SVN库阻止多个程序并发访问的锁。
我们讨论的是如何与其他同事和谐开发的锁。也就是第一种锁。SVN对于二进制文件,是不能Merge的,所以我们在修改二进制文件时,如果不上锁,遇到冲突,那么是无法解决的。比如,我在修改一张图,而另外一个同事也在修改,即使我们可能修改的位置不一样,但是,也不可能合并。而且,如果我修改了半天,他突然提交了。那么我这半天的工作,就不能合并到SVN库中。这对于我的工作来说,只能是白费劲。
所以,在遇到一些二进制文件时,我们最好使用Lock-Modify-Unlock 机制。
$svn lock apple.jpe -m "Editing file for painting"
这样就锁住了文件。并且在本地有缓存了一个lock token
$svn info apple.jpg
...
...
Lock Token :opaquelocktoken:0c056006-88f9-03109e48
LockToken是公开的,以表面在某个WorkingCopy中某人锁住了文件。而不是一个异常。
LockToken跟随WorkingCopy的。如果你在办公室的WorkingCopy锁住了一个文件,那么你回到家的时候,你发现,你不能提交了。因为锁认证是需要两个条件:
你是锁的拥有者
你有LockToken
如果你在认证通过后,提交了文件,锁自动解开。并且,在同一个目录下的锁都会解开。当然,你如果只是提交一个功能,还想继续锁住,编写下一个功能,那么使用 --no-unlock
如果你不想提交,也不想锁住文件那么使用
$svn unlock file
就可以解锁。
我们可以通过
$svn status -u
M O 32 apple.jpg
O表示被其他人锁住了(other)。
如果你急需编辑文件,或者加锁的人渡假去了,而我们必需要完成他未完成的功能,那么我们是可以干掉这个锁的。
两种方法,一是找管理员。
$svnadmin lslocks /var/svn/idp
$svnadmin rmlocks /var/svn/idp/apple.jpg
或者我们自己来
$svn status -u
$svn unlock --force /var/svn/idp/apple.jpg
使用--force,很暴力。使用svn status查看
$svn status -u
B 32 apple.jpg
B 表示锁坏了(broken)
SVN在设计的时候,这里有两个争论。就是是否只有管理员能解锁?还是其他用户也能解锁。SVN 使用了灵活的方式,我们可以用户解锁,但是也可以使用 Repostory hook来设置只有管理员可以解锁。关于hook的问题,我们就不多说了。
分享到:
相关推荐
### SVN学习笔记 #### 版本控制的重要性及概念解析 版本控制在软件开发过程中扮演着极其重要的角色。尤其是在多人协作的环境下,版本控制系统能够有效帮助团队成员管理代码、文档和其他重要资源的不同版本,确保每...
- 学习笔记通常包含个人理解和实践总结,可能涵盖一些实用技巧和常见问题解决方案。 通过以上内容,你将能够掌握SVN的基本操作和使用策略,更好地融入团队开发环境中。在实际工作中,结合具体的项目需求和团队协作...
**标题解析:** "svn学习笔记-windows下安装svn加apache的安装流程" 这个标题告诉我们,本文将重点讲解如何在Windows操作系统上安装Subversion(简称svn)以及与Apache服务器的集成配置过程。Subversion是一款流行...
以下是对"SVN笔记学习"内容的详细解读: 1. **Linux下SVN的搭建** - **安装SVN**: 在Linux系统中,通常通过包管理器来安装SVN,如在Ubuntu或Debian上使用`apt-get install subversion`,在CentOS或Fedora上使用`...
本文将从SVN客户端与服务器端的安装配置、版本控制操作、用户权限管理以及数据备份恢复等方面进行详细的学习笔记记录。 首先,进行SVN客户端软件的安装,以TortoiseSVN为例,它为Windows环境下提供图形界面的客户端...
**我的SVN学习笔记(原创)** 在信息技术领域,版本控制系统是不可或缺的工具之一,它帮助开发者跟踪和管理代码的变化,使得多人协作变得有序而高效。Subversion(简称SVN)就是这样的一个开源版本控制系统,它允许...
通过本文的学习,我们不仅深入了解了SVN的基本概念和原理,还掌握了SVN的实际应用技巧。无论是对于个人开发者还是大型软件团队,熟练运用SVN都是非常必要的。希望本文能够帮助读者更好地理解SVN的核心价值,并将其...
这篇学习笔记主要涵盖了SVN的基本概念、安装与配置、基本操作以及在实际开发中的应用。 1. SVN的基本概念 - 版本库(Repository):存储所有版本历史信息的地方,相当于数据库。 - 工作副本(Working Copy):...
- Git是另一种流行的版本控制系统,相比SVN,Git具有更快的速度和分布式特性,但在某些场景下,SVN的简单性和易用性可能更胜一筹。 7. 学习和使用资源: SVN的官方文档和各种社区论坛提供了丰富的学习资源,如...
总之,通过"svn搭建笔记.zip"这份资源,你可以系统地学习如何从零开始搭建SVN服务器,逐步掌握版本控制的核心概念和操作技巧,这对于任何软件开发者而言都是一项基础且必要的技能。记得在实践中多加练习,理论结合...
SVN与CVS一样,是一个跨平台的软件,支持大多数常见的操作系统。作为一个开源的版本控制系统,Subversion 管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (repository) 中。 这个档案库很像一个普通的...
在“svn技术总结本人自己学习笔记.zip”这个压缩包中,我们可以期待找到关于SVN的基本概念、安装配置、日常操作、冲突解决以及高级特性的学习记录。 首先,SVN的核心概念包括仓库(Repository)、工作副本(Working...
《我的cvs2svn笔记》是一份详细的指南,旨在帮助用户在Windows环境下将CVS(Concurrent Versions System)版本库转换为SVN(Subversion)版本库。CVS是一种广泛使用的源代码控制系统,而SVN则因其先进的特性,如分支...
SVN支持强大的分支和合并策略,允许开发者在不影响主线(主分支)的情况下进行开发。SVN也在开源社区和商业领域获得了广泛应用。 分布式版本控制系统以GIT为代表,它使用分散的架构,每个开发者都拥有完整的版本库...
2. **SVN使用教程**:"svn-笔记.docx"和"svn.docx"可能会详细解释如何创建、检出、提交、更新和解决冲突等基本SVN操作。此外,可能还会涉及到如何使用命令行工具和图形化客户端,如TortoiseSVN。 3. **Maven安装**...