我是一个刚到企业的新手。以前没用过svn。怎样才能最快的速度掌握?能详细说说吗?
Svn(subversion)是近年来兴起的版本管理工具,是cvs的继承者。目前大多数开源软件都使用svn作为代码版本管理软件。
客户端的使用
1.签出存储库
首先,在服务器端签出存储库。
所谓签出是指获取服务器指定的存储库中存储的所有文件。
这种签出的意义与Visual Source Safe完全不同。
VSS的签出是指锁定文件。如果您以前使用过VSS,
学习颠覆一定要注意这个问题。
具体的结账方式是:
在客户端创建一个空目录,例如:F:\Project1。
右键单击目录并选择“SVN签出”...在弹出菜单中。
然后在“存储库的URL”文本框中填写您想要连接的存储库的地址。
此URL地址可以通过浏览添加。
对于本教程第二部分中建立的存储库,
网址应该是“svn://xxx/project1”。
(xxx可以是服务器的主机名,也可以是服务器的ip地址)。
然后点击确定,会弹出一个认证对话框。
输入在本教程第三部分中设置的用户名和密码。
单击“确定”完成存储库的签出。
例如,在服务器端存储库中有一个a.txt文件。
那么签出后F:\Project1目录下也会出现一个a.txt文件。
在这个例子中,由于服务器端储存库没有添加任何文件,
所以在客户端的F:\Project1下没有签出任何文件。
除了生成存储在F:\Project1的存储库中的文件和目录之外,
的隐藏目录”。svn”也生成了,它由subversion管理。
不要删除或手动更改文件和目录。
现在F:\Project1中的文件和目录称为资源库的“工作副本”,缩写为“WC”。
这是的简称...可汗。
将来修改、添加和删除存储库中的文件和目录的操作,
都是通过这个“工作副本”的操作来实现的。
在执行结帐后,
在F:\Project1目录中,您会在图标的左下角看到一个小的状态图标。
(当F:\Project1目录下的文件发生变化时,这个状态图标也会发生变化),
这意味着F:\Project1是一个存储库的“工作副本”。
f:\ Project 1中的所有文件和目录都会有类似的状态图标。
添加文件
将要添加的文件或目录复制到F:\Project1。
然后右键单击文件或目录,Tortoisesvn->;添加,点击确定
如果添加了多个文件或目录,
然后不要点击F:\Project1中的任何文件。
然后右击,TortoiseSVN-& gt;添加,
您可以添加多个文件或目录。
文件的状态图标将会改变。
Add命令只是告诉本地“工作副本”将文件放入版本管理中。
此更改未提交给服务器。
如果您希望其他人看到您对存储库的更改,您需要
在F:\Project1下单击鼠标右键,SVN提交...
将您的更改提交到存储库。
文件的状态图标也将被更新。
无论您在“工作副本”中添加、修改或删除文件,
如果其他人想看你的修改,
您必须使用Commit命令将更改提交到服务器端存储库。
修改文件
用文本编辑器或IDE修改文件后,
文件的状态图标会改变,
然后右击,SVN提交。...
提交修改,并且仅在提交修改之后,
您的更改将反映在服务器端存储库中。
删除文件
删除文件时,选择要删除的文件或目录。
右击,TortoiseSVN-& gt;删除,提交修改。
注意不要使用“删除”键删除文件,否则您将无法提交您的更改。
这对于删除目录尤其重要。
5.放弃修改
当您添加、修改或删除文件时,您决定放弃修改。
你可以右击,TortoiseSVN-& gt;回复,
本地“工作副本”中的文件和目录将恢复到您修改它们之前的状态。
6.获取最新版本的存储库
当一个团队合作开发一个项目时,
每个人都在不断更新存储库。
你需要不断更新你的“工作副本”。
获取项目的最新文件。
当您第一次获得最新的存储库文件时,
我们使用前面介绍的Checkout命令。
以后拿到最新文件就不需要签出了。
请改用Update命令。
按照前面的例子,F:\Project1已经成为“工作副本”。
(通过执行Checkout命令),现在其他人已经修改了存储库,
我想把别人的修改反映到我的“工作文案”里。
具体方法是:右击F:\Project1目录,
SVN最新消息.此时F:\Project1中的文件是最新版本。
请注意,如果您的“工作副本”中有修改过的文件,
或者存在已删除的文件,并且这些更改尚未提交,
这些文件在更新过程中不会被更新。
比如修改F:\Project1下的a.txt文件,
没有提交任何更改,那么,
当您更新F:\Project1时,
a.txt文件不会更新为存储库上的a.txt文件。
所以如果你想放弃目前所有的修改,
并将F:\Project1下的所有文件和目录更新到最新版本,
Revert命令应该在Update命令之前在F:\Project1上执行。
7.subversion的版本控制模型
当您使用subversion进行版本控制时,
Subversion将记录您对存储库所做的每一个修改(包括添加、修改、删除等等)。).
每次修改存储库时,都会生成一个新的修订号。
不同的版本代表了不同时间的存储库状态。
因此,我们可以使用这个版本随时调用存储库的状态。
就像时光机一样,也就是说,修订版
是存储库在某一时刻的“快照”。
注意:版本不是特定于文件或目录的。
而是针对整个存储库。
每次修改存储库时,修订版都会增加1。
Subversion的版本控制模型叫做复制-修改-合并。
(复制-修改-合并)模型。
考虑这种情况:
张三和李四是公司同一个部门的同事。
他们维护一个文本文件a.txt,
并控制文件的版本,
所以他们把这个文件放在一个仓库里并维护它。
周一上午9点,张三和李四同时要修改a.txt文件。
所以他们也从存储库中获得了文件的最新版本(修订版10)。
然后做出改变。三分钟后,张三先完成了修改。
他更改了文件第五行中一个单词的拼写(将错别字改为打字)。
于是张三对修改后的文件执行了Commit命令。
将更改提交到服务器端存储库。
此时,存储库的修订版变为11。
六分钟后,李四也完成了他的复习。
他修改了文件第十行一个单词的拼写(把He改为She)。
因此,他还对修改后的文件执行了Commit命令。
这时,Subversion会发现在提交变更时,
李四修改的文件是版本10的. txt文件。
而不是最新版本的11 a.txt文件。
所以,Subversion提醒李四,在提交修改之前,
您应该首先将工作副本更新到最新版本。
李四执行更新命令,将工作副本更新为版本11。
Subversion将提示合并已经完成。
李四的a.txt文件第五行的“错别字”改成了“类型”。
第十行还是“她”,意思是Subversion已经把张三的修改“合并”到李四的a.txt文件里了。
之后李四会再次执行Commit命令,然后就可以修改第十行了(把He改成She)。
已提交到服务器端存储库(生成修订版12)。
但是,这种合并在某些情况下会变得更加复杂。
比如李四修改a.txt文件不是第十行。
而是像张三一样,修改第五行中的文字。
李四将“Typo”改为“typr”,提交修改意见。
Subversion会提示李四在提交修改之前,
您应该首先将工作副本更新到最新版本。
李四执行更新命令,将工作副本更新为版本11。
此时,Subversion会将版本11的a.txt文件与。
合并李四修改的a.txt文件时,发现李四也修改了第五行。
颠覆不能判断是李四的改装(“Tpyr”)。
正确还是张三的修改(“类型”)正确,
因为都是在10版a.txt的基础上修改的。
这种情况被称为冲突,
. txt文件的图标将变成黄色三角形。
这个时候李四只能靠自己判断第三行应该修改为“Typpr”还是“Type”。
当李四确认修改后,右击a.txt文件,Tortoisesvn->;断然的
告诉Subversion冲突已经解决。
此时,执行Commit命令提交修改(生成修订版12)。
Subversion确保您对文件所做的所有更改都基于文件的最新版本。
8."8."。svn”目录
“会有。svn "目录下的每一层客户端工作副本。
Subversion使用这个目录进行管理。
不要手动修改其中的文件。
该目录存储工作副本的副本。
(副本的实际存储位置是目录F: \ Project 1 \。SVN \ text-base),
例如:F:\Project1是工作副本,
这个目录下有两个文件a.txt和b.txt,还有一个子目录ccc。
子目录ccc下还有一个d.txt文件。
的”。svn "目录在您最后一次执行更新或提交命令后,将文件的副本存储在当前目录中。
例如:f: \ Project 1 \中存储的a.txt和b.txt。SVN \文本基础。
是最近一次更新或提交命令后F:\project1下a.txt和b.txt的副本。
也就是说,您所做的所有更改都是基于存储在。svn”目录。
这种机制允许我们连接到网络,
将工作副本中的文件恢复到修改前的状态。
Subversion的Revert命令就是通过使用这种机制实现的。
例如,如果修改F:\project1\a.txt文件,
这时你改变了主意,想放弃修改档案。
你可以右击,TortoiseSVN-& gt;回复,
修改了F:\project1\a.txt文件
它将被替换为f: \ Project 1 \中的一个. txt文件的副本。SVN \文本基础。
以便将a.txt恢复到修改前的状态。
“会有。svn”目录下的每个子目录中的工作副本。
不仅仅是顶级目录有“.”。svn”目录。
因此,也有一种”。svn "目录下的F:\project1\ccc。
此目录存储f: \ Project 1 \ CCC \ d.txt的副本。
(d.txt的副本位于f: \ project1 \ CCC \。SVN \ text-base)。
也就是说,每一个”。svn "目录只存储同一级目录中"文件"的副本。
而不存储目录副本。的”。svn "目录包含了许多重要的内容。
所以当删除文件或目录时,
TortoiseSVN-& gt;删除,
不能用“删除”键删除文件或目录,尤其是对目录的删除。
9.混合版本
Subversion的工作副本被设计成包含不同版本的文件。
例如,F:\Project1是一个工作副本。
这个目录下有两个文件a.txt和b.txt。
执行更新命令,将工作副本更新到最新版本(修订版24)。
此时,a.txt和b.txt的版本都是24。
(其实单个文件是没有修订的。
修订是针对整个存储库的,
这里指的是存储在存储库版本24中的a.txt和b.txt。
但为方便起见,请注意采用此描述,下同)。
之后你同事修改了a.txt,提交了修改。
此时,存储库的版本变为25。
请注意,此时您没有再次执行更新。
所以你的工作副本版本仍然是24。
这时你修改了b.txt文件,提交了修改。
因为Revision25没有修改b.txt文件,
因此,您对b.txt文件的修改是基于b.txt文件的最新版本。
所以不会有冲突。
当您提交b.txt的修改时,会生成版本26。
这时,你会发现你的工作副本中的a.txt文件并不是Revision25中的a.txt文件。
也是Revision24的a.txt文件,你的b.txt文件是Revision26的b.txt文件。
也就是说,当您提交时,只有您在工作副本中提交的那些文件才是最新的版本。
其他未修改的文件不会更新到最新版本。
这将导致您的工作副本由不同的修订文件组成。
(版本24的a.txt文件和版本26的b.txt文件)。
我之前说过,在提交修改之前,你必须确保你是在最新版本的基础上修改文件的。
如果在这种混合版本的情况下,
如何知道当前工作副本中的文件是否是最新版本?
前面提到的“条目”中有一个名为“条目”的文件。svn”目录。
该文件记录当前工作副本中每个文件的修订。
因此当您提交时,Subversion将从文件中获取您提交的文件的修订版。
通过与Repository的最新版本进行比较,可以知道您修改的文件是否基于文件的最新版本。
10.文件锁定
如前所述,Subversion的版本控制模型是一种叫做复制-修改-合并的版本控制模型。
(复制-修改-合并)模型。
该模型在文本文件的版本控制中工作良好,
但是有些需要版本控制的文件不是文本文件。
比如图像文件,这种情况下这个模型无法正常工作。
因为文本文件可以合并,二进制文件不能合并。
所以Subversion从1.2支持一个叫锁-修改-解锁的方法。
(锁定-修改-解锁)版本控制模型。
这种模型被Windows下最常用的版本控制软件Visual Source Safe(VSS)所采用。
这种模式要求文件在被修改之前应该被锁定。
然后就可以修改了。此时,其他人将无法修改该文件。
修改后释放锁定,以便其他人可以锁定文件,然后修改它。
锁定文件的方法是:Tortoisesvn->;获得锁定...再次单击“确定”按钮,
此时,文件被锁定。
此时,如果其他人想要锁定文件,
Subversion会提示他文件已被他人锁定。
当您完成修改文件,然后右键单击,SVN提交...
提交更改,默认情况下,提交时文件将被解锁。
如果您仍想锁定文件,请在提交时弹出的对话框中选择“保持锁定”复选框。
11.文件的附加属性
在Subversion中,每个文件都有一个叫做附加属性的东西。
附加属性描述了该文件的一些特征。
Subversion预定义了一些额外的属性。
(这只意味着Subversion已经定义了一些附加属性的“名称”。
这并不意味着这些属性已经附加到文件中。
例如,默认情况下,文本文件最初不包含任何属性,
直到附加属性被人为地添加到文件中),
您可以向文件中添加自定义属性。
Subversion对待附加属性就像对待文件内容一样。
当修改文件的附加属性(添加、改变和删除附加属性)时,
即使文件的内容没有被修改,
您也可以提交文件,就像更改文件内容一样。
存储库还将生成一个新的修订版本,
所以从某种意义上来说,
Subversion不会将文件附加属性的修改与文件内容的修改区别对待。
文件的附加属性可以看作是一种特殊的文件内容。
Subversion预定义了几个附加属性,
这里只讨论“svn:needs-lock”属性。
因为和上面的一个文件锁定导致的问题有关。
对于其他属性,请参考Subversion附带的帮助文档。
考虑到这种情况,
张三和李四同时想修改a.jpg的一个图片文件。
张三先锁定文件,再修改。
与此同时,李四也开始修改文件。
但是李四忘了,非文本文件在修改的时候要先锁定。
张三首先完成了对文件的修改,于是张三将自己的修改提交给了服务器。
之后,李四也完成了修改。当他提交修订版时,
Subversion提示李四文件版本不是最新的。
在提交之前,A.jpg应该更新到最新版本。
因为图片文件不能合并,
这意味着张三和李四之间必须有一个人的修改。
应用“svn:needs-lock”属性可以避免这个问题。
当文件具有“svn:needs-lock”属性时,
当文件未锁定时,文件的图标为灰色。
指示该文件是只读文件(选中了该文件的Windows只读属性的复选框)。
这个灰色图标会提醒想修改文件的人。
您应该在修改文件之前锁定它。
锁定文件后,文件的只读属性将被删除。
一旦解除锁定,文件图标将再次变成灰色。
该文件将变为只读。
在这种情况下,李四会避免在文件未锁定时修改文件。
将“svn:needs-lock”添加到非文本文件中。
属性应该在文件第一次添加到存储库时设置,
当然,文件可以随时添加附加属性。
这样做是为了减少李四遇到问题的概率。
具体方法是:
首先,将a.jpg文件复制到工作副本。
然后右键单击该文件,
TortoiseSVN-& gt;添加,告诉Subversion将文件置于版本控制之下,
然后右键单击该文件并选择属性。
在弹出的属性对话框中选择Subversion页面。
在下拉框中选择“svn:needs-lock ”,
并在下面的文本框中填写“*”。
(其实这里填什么都无所谓,只要文件有“svn:needs-lock”这个附加属性就可以了),
然后点击Set按钮,附加属性“svn:needs-lock”将被设置。
然后执行Commit命令提交更改。
此时,当其他人执行更新时,
A.jpg将被添加到他们的工作副本中。
并且该文件的附加属性将与该文件一起获得。
你可以看到a.jpg的图标此时是灰色的。
该文件的Windows属性也是只读的。
12.回到以前的版本
因为Subversion将记录您对存储库所做的每一个修改,
因此,很容易获得存储库在之前某个时刻的状态。
例如,存储库的最新版本是56。
此时,我想看看版本24的存储库的状态。
您可以右键单击本地工作副本。
TortoiseSVN-& gt;更新到版本...,
然后输入您要回复的版本号,并点击“确定”按钮。
回到以前的版本,还有另一种情况,我想把存储库的
最新修订版的状态与先前修订版的状态完全相同。
上述方法不合适,
上述方法仅将本地工作副本恢复到其先前的状态。
服务器端存储库尚未返回到其先前的状态。
将存储库的最新版本状态恢复到以前版本状态的具体方法是:
执行更新命令,将工作副本更新为最新版本。
然后右键单击工作副本,
TortoiseSVN-& gt;显示日志,
弹出的日志消息窗口将显示存储库的所有修订。
选择最新版本,然后按住Shift键。
然后点击要回复的修订版+1。
(例如,存储库的最新版本是30。
您希望将存储库的状态恢复到版本16。
然后选择Revision30并按住Shift键。
选择版本17,
也就是说,选择17版和30版之间的所有版本。
然后右键单击选定的修订,
选择“从这些修订中还原更改”。
再次单击“是”按钮,工作副本的状态将恢复到目标版本。
请注意,此时只有工作副本恢复到目标版本。
之后,您应该使用Commit提交更改。
这样,存储库的最新状态与目标修订版的状态相同。
这两种恢复到以前版本的方式是完全不同的。
第一种方法是将整个工作副本恢复到修订版。
也就是说,通过这种方式,文件的副本存储在了”。工作副本中的“svn”目录与目标版本完全相同。
如果此时不修改文件,您将无法执行提交命令。
在第二种方式中,工作副本中的客户端
该副本存储在”。svn "目录总是最新版本的文件副本。
(这里我们假设在更新之后没有其他人修改过这个存储库)。
这种方式类似于手动将工作副本的文件状态更改为目标版本。
修改后提交修改。
13.查看和修改
有时我们会修改工作副本的许多文件。
这些文件位于不同的子目录中,因此我们可以右键单击工作副本的顶层目录。
TortoiseSVN-& gt;检查修改,
弹出的对话框会显示你修改的所有细节。
另一种情况是,我们的工作副本已经很久没有执行更新命令了。
我们希望看到工作副本中的哪些文件已被修改。
此时,您可以右键单击工作副本的顶层目录。
TortoiseSVN-& gt;检查修改,
单击弹出对话框中的“检查存储库”按钮后,
将显示在服务器端修改过的文件。
该方法的另一个目的是检查文件的锁定,
当你想锁定一个文件时,你想看看它是否被其他人锁定。
单击“检查存储库”按钮,显示服务器端存储库中所有锁定的文件。
如果你要锁定的文件不在里面,说明该文件目前没有被锁定。