svn客(kè)户端64位版1.8.10.26129中文(wén)win7/win8通用版是(shì)CVS的(de)接班人,目前,绝大多数(shù)开源软件都使用svn作为代码版本(běn)管理软件。软件除了能记住文件和目(mù)录的每次(cì)修改以外,版本库非常像普(pǔ)通(tōng)的文件服务器(qì),你可以将文(wén)件恢复到(dào)过去的版本(běn),并且(qiě)可以通过检查历(lì)史知(zhī)道数据(jù)做了哪些(xiē)修改,谁做的修改。这就是(shì)为什么许多人将 Subversion 和版本控制(zhì)系(xì)统看作一种“时(shí)间机(jī)器”。
svn客(kè)户端64位版作为CVS的重写版和改进版(bǎn),其(qí)目标就(jiù)是作为一个更好的版本控制软件,取代CVS.总的来(lái)说,CVS在发展的过程中(zhōng)逐渐失去优势,已经不再适合现代开(kāi)发,目前,绝大多数CVS服务已经改用SVN.
版本控制是管理信息修改的艺术,它(tā)一直是程序(xù)员最重要的(de)工具,程序员经常会花(huā)时间(jiān)作出小的修改,然后又在某一天取消了这些修改,想象一下一个(gè)开发(fā)者并行工作的团队 - 或许是同时工作在同一个(gè)文(wén)件!- 你就会明(míng)白为什么一个(gè)好的系统需要管理潜(qián)在的混乱。
1.Checkout Repository
首先要Checkout服务器端的Repository,
所谓的Checkout就是指获得(dé)服务器端指定的Repository存储的所有文(wén)件。
这个Checkout和(hé)Visual Source Safe的Checkout意(yì)义完全不一样,
VSS的Checkout指(zhǐ)的是锁定(dìng)某个文(wén)件,如果你以前(qián)使用过VSS,
在学习(xí)Subversion时这个问题一(yī)定要注意。
Checkout的(de)具(jù)体方式是:
在客户端新建一个空目录,比如(rú):F:\Project1
在(zài)该目录(lù)上单击右(yòu)键,在弹出式菜单中选中SVN Checkout...,
之后在“URL of Repository”文本框中填入(rù)你想要连接的Repository的地址,
这个URL地址可以用浏览方式加入。
对(duì)于在(zài)本教程第二节建立的Repository,
URL应该是“svn://xxx/project1”
(xxx可以是服务器端主机名,也(yě)可以是服务器端的ip地(dì)址)。
然后点OK,会弹出(chū)一(yī)个认证对话框,
输入(rù)在教(jiāo)程第三节设置的用户名(míng)和密码。
点OK后就完成了(le)对Repository的Checkout。
比如:在服务器端(duān)Repository中有一个a.txt文件,
那么Checkout之后F:\Project1目录下也会出(chū)现(xiàn)一(yī)个a.txt文件。
在本例中由(yóu)于服务器端的Repository还未添加任何文(wén)件,
所以在客户端的F:\Project1下(xià)没有(yǒu)文(wén)件被Checkout。
执行Checkout除了(le)会(huì)在F:\Project1产(chǎn)生Repository存储的文件及(jí)目录外,
还会(huì)产生(shēng)了一个“.svn”的隐含目录(lù),该目录是由subversion管理的(de),
不要删除或者(zhě)手工改动其中的文件(jiàn)和目录。
现在F:\Project1中(zhōng)的(de)文(wén)件和目录就(jiù)叫做Repository的(de)“Working Copy”简写(xiě)“WC”
(这个简写...汗)。
以(yǐ)后对Repository中文件和目录(lù)的修改,添加(jiā),删除的操作,
都是通过对这个“Working Copy”的操作(zuò)实现的。
Checkout执行完(wán)后,
会发现F:\Project1目录的图标(biāo)的左下角附着了一个(gè)小的状态图标
(当F:\Project1目录中的文件改变(biàn)时,这个状态图标也会(huì)随之(zhī)变(biàn)化),
它(tā)表示F:\Project1是一个Repository的“Working Copy”,
F:\Project1内的所有文件和目录也会有类似的状(zhuàng)态图标。
2.添加文件(jiàn)
将要添加(jiā)的(de)文件或(huò)者目录拷贝(bèi)到F:\Project1下,
然后在该文件或目录上单(dān)击右键,TortoiseSVN->Add,点(diǎn)OK。
如(rú)果添加了不止一(yī)个文件或目录(lù),
则鼠标(biāo)不要(yào)在F:\Project1中点中任何文件,
然后单(dān)击(jī)右键,TortoiseSVN->Add,
就(jiù)可以添(tiān)加多个文件或目录。
这时文件的状态图标会发生变化。
Add命令(lìng)只(zhī)是告(gào)诉本地的“Working Copy”将该文件(jiàn)纳(nà)入版本管理,
并没(méi)有(yǒu)将(jiāng)这个改变提交到服务器(qì)端,
如果想(xiǎng)要(yào)别人(rén)也看见你对Repository的修改(gǎi),你需要(yào)
在(zài)F:\Project1下(xià)单(dān)击右键,SVN Commit...,
将你所(suǒ)做的修改(gǎi)提(tí)交到Repository。
文件的状态图标也会更新。
不管(guǎn)你在“Working Copy”内添加、修改、删(shān)除文件后,
要想其他人也看见你的修(xiū)改,
都必须(xū)用Commit命令将所做修(xiū)改(gǎi)递交到服务器端的Repository。
3.修(xiū)改文件
用文本编(biān)辑器或IDE对文件修改(gǎi)后,
文件的状(zhuàng)态(tài)图(tú)标会变化,
然后单击右键,SVN Commit...
提交修改,只有(yǒu)当执行Commit提交修(xiū)改后,
你所(suǒ)作的修改(gǎi)才会反(fǎn)映到服务器端的Repository中(zhōng)。
4.删除(chú)文件(jiàn)
删除文件时,选中要删除(chú)的文件或目录,
单(dān)击右键,TortoiseSVN->Delete,提交修(xiū)改。
注意(yì)千万不要用“Delete”键来删除文件,否(fǒu)则将(jiāng)无法提交你的修改。
这一(yī)点对目录的(de)删除来说尤为重要。
5.放弃修改
当你添加(jiā)、修改、删除(chú)文件后,决定放(fàng)弃修改,
你可(kě)以单(dān)击右键,TortoiseSVN->Revert,
本地的“Working Copy”中(zhōng)的文件和(hé)目录会恢(huī)复到你修改前的状态。
6.获取Repository的(de)最新版本
当一个团(tuán)队合作开发项目时,
每一个(gè)人都在不断的对(duì)Repository进行更新,
你需要不(bú)断(duàn)的更新自己的“Working Copy”,
以获取项目最(zuì)新的(de)文件。
当第一次获得最新Repository的文件时,
我们用(yòng)Checkout命令,前面已经介绍了,
以后再获取最新文件(jiàn)时就不(bú)用Checkout了。
而改用Update命令。
接着前面的例子,这(zhè)时F:\Project1已(yǐ)经成为一(yī)个“Working Copy”了
(通(tōng)过(guò)执行Checkout命令),现在(zài)其他(tā)人已(yǐ)经对Repository进行(háng)了(le)修改,
我想将别人的修改反(fǎn)映到我的“Working Copy”中,
具体的方法是:在F:\Project1目录上单(dān)击右键,
SVN Update。这(zhè)时F:\Project1中的文件(jiàn)就是(shì)最(zuì)新的版(bǎn)本了(le)。
注意,如果当(dāng)你的“Working Copy”中有被修改的文件,
或者有被删除(chú)的文(wén)件,并且还未提(tí)交这些修改时,
这些文件在执行Update过程中是(shì)不会被更(gèng)新的。
比如你修改了F:\Project1下a.txt文件,
还(hái)未提交修改,那么,
当(dāng)你对F:\Project1进行Update时,
a.txt文件是不会更新为Repository上的a.txt文件(jiàn)的。
所以如(rú)果想放弃当前的(de)所(suǒ)有修改,
并将F:\Project1下所有文件及目录更新到最新版本,
应该先对F:\Project1执行Revert命令再执行Update命令。
7.subversion的版本控制模型
当你(nǐ)用subversion进行版本控制时,
Subversion会记录你对(duì)Repository进行的(de)每一(yī)次修改(包括添加,修改,删(shān)除等等(děng)),
每修改一次Repository都会产生一个新(xīn)的(de)Revision(修订版本号),
不同的(de)Revision代表(biǎo)了不同时刻(kè)Repository的状态,
因(yīn)此我们可以用这(zhè)个(gè)Revision回朔任意时刻Repository的状态,
就像时间机器一样,也就是说某(mǒu)一Revision
就(jiù)是Repository在某一时(shí)刻的一(yī)个“快照”。
注意:Revision不是针对某一个文(wén)件或(huò)者目录,
而是针对整个Repository而(ér)言的。
每修改(gǎi)一次(cì)Repository,Revision 都(dōu)会增加1。
Subversion的版(bǎn)本(běn)控(kòng)制模(mó)型是一种叫做Copy-Modify-Merge
(拷贝-修改-合并(bìng))的模型。
考虑这种情(qíng)况:
张三和李四是公司(sī)同一个部门的同事,
他们共同维护一个文本文(wén)件a.txt,
并且对该文(wén)件进行版本控制,
因此他们把(bǎ)这个文件(jiàn)放到一个Repository上共同维护该文件(jiàn)。
周一上午9点,张三和李四同时想对a.txt文件进行修改,
于是他们同时从Repository上(shàng)取得该文(wén)件的最新版本(běn)(Revision 10),
然后进行修改(gǎi)。过了三(sān)分钟,张三首先完成了修改(gǎi),
他在该(gāi)文(wén)件的第五行修(xiū)改了一个单词的(de)拼写(将Typo改为Type),
于是张三对修改后的文(wén)件执行Commit命(mìng)令,
将修改提交到服务器端(duān)的Repository中。
这时(shí)Repository的Revision变为11。
六分钟过后,李四(sì)也完成了他(tā)的修改,
他(tā)修改了该文件第十行(háng)上的一个单词拼写(xiě)(将He改(gǎi)为(wéi)She),
于(yú)是他也对修改后的文件执行Commit命令,
这时(shí)Subversion 在(zài)提交修改时会(huì)发现,
李(lǐ)四修改的文件是Revision10的(de)a.txt文(wén)件,
而不(bú)是最新的Revision 11的a.txt文件。
于是,Subversion 提示李四在提(tí)交修改前,
应该先将Working Copy更新(xīn)到最新(xīn)版本,
李四执行Update命令(lìng)将(jiāng)Working Copy更新到Revision 11,
这时Subversion会提示已经完成合并,
李(lǐ)四(sì)的a.txt文(wén)件的第五行的“Typo”已(yǐ)经变为了“Type”,
第十行还是“She”,就是说Subversion已经将张(zhāng)三的修改“合(hé)并”到李四的a.txt文(wén)件中了。
之后,李四再执(zhí)行Commit命令,就(jiù)能将他对第十行的(de)修改(将He改为She)
提交到服(fú)务器(qì)端的Repository中了(le)(生成Revision 12)。
但是(shì)这(zhè)种合并(bìng)在某些情况下会变得复杂一(yī)些,
比如:李四对a.txt文件的修改并不是第十行,
而是与张三(sān)同样修改第五(wǔ)行的(de)单词,
李(lǐ)四(sì)将(jiāng)“Typo”改为“Typr”,并且提(tí)交(jiāo)修改,
这时Subversion会(huì)提(tí)示李四(sì)在提交修改前,
应该先将(jiāng)Working Copy更(gèng)新到最新版(bǎn)本,
李四执(zhí)行Update命(mìng)令将Working Copy更(gèng)新(xīn)到Revision 11,
这时Subversion将Revision11的a.txt文(wén)件与
李四修改的a.txt文件进行(háng)合并时发现李(lǐ)四修(xiū)改的同样是第五行,
于是Subversion就无(wú)法判断(duàn)是李(lǐ)四(sì)的修改(“Tpyr”)
正(zhèng)确还是(shì)张三(sān)的修改(“Type”)正确,
因为他们都是在Revision10的a.txt基础上(shàng)作的修改。
这种(zhǒng)情(qíng)况叫做Conflict(冲(chōng)突),
a.txt文件的图标会变(biàn)成一(yī)个黄色三角。
这时,只(zhī)能依靠李(lǐ)四(sì)自(zì)己去判断到底第三行应(yīng)该修(xiū)改为“Typr”还是“Type”。
当李四确(què)定修(xiū)改之后,在a.txt文件上单击右键,TortoiseSVN->Resolved
告诉Subversion已经解(jiě)决了(le)Conflict。
这时再执行Commit命令就能提交修改(生成Revision 12)。
Subversion 这种控制方式保(bǎo)证了你对文件所作的修改都是(shì)基于文(wén)件的最新版本(běn)。
8.“.svn”目(mù)录
在(zài)客户端(duān)Working Copy的每一层目录中都会有一个“.svn”目(mù)录,
该目(mù)录是Subversion进行管理用的(de)目录。
不(bú)要手(shǒu)动(dòng)修改(gǎi)其中的文件。
该目录存储(chǔ)了Working Copy的一个副本
(实际存储副本的(de)地方是F:\project1\.svn\text-base目(mù)录),
比如:F:\Project1是(shì)一个(gè)Working Copy,
该目录下有两个文件a.txt和b.txt还有一个子(zǐ)目录ccc,
子目录ccc中还有一个d.txt文件。
“.svn”目录中存储的是你最近(jìn)一次执行(háng)完Update或者Commit命令之后当前(qián)目录中(zhōng)文件(jiàn)的副本,
比如:F:\project1\.svn\text-base中(zhōng)存储的a.txt和b.txt
是最近一(yī)次执行完(wán)Update或者(zhě)Commit命令之后F:\project1下的a.txt和b.txt的拷贝。
也就(jiù)是(shì)说你所作的修改都是基(jī)于“.svn”目录存储的那些文(wén)件。
这种(zhǒng)机制可(kě)以让我们在不(bú)连接网络的情况下,
将Working Copy中的文件恢复到修改之前的状态。
Subversion的Revert命令就是利用了这种机制来(lái)实(shí)现的(de)。
比如你修改了F:\project1\a.txt文件,
这时你又改(gǎi)变了(le)主意想放弃(qì)对该文件的修改,
你(nǐ)可以单击右(yòu)键,TortoiseSVN->Revert,
修改过(guò)的(de)F:\project1\a.txt文件(jiàn)
就会被F:\project1\.svn\text-base中a.txt文件(jiàn)的(de)副(fù)本所替(tì)代,
使得a.txt恢复到修改前的(de)状态。
Working Copy中每一个子目录下都(dōu)会有一个“.svn”目录,
并不是(shì)只有最上层(céng)目录才有(yǒu)“.svn”目录。
所以,F:\project1\ccc下也有一个(gè)“.svn”目(mù)录,
该目录存储的是F:\project1\ccc\d.txt的副本
(d.txt的(de)副本(běn)位于F:\project1\ccc\.svn\text-base)。
也就是(shì)说每个“.svn”目(mù)录只(zhī)存储同级目录中的“文件”副本,
而不存(cún)储(chǔ)“目录”副本。“.svn”目录存有(yǒu)许多(duō)重(chóng)要的内容,
所以前(qián)面(miàn)说在删除文件或目录时,
必须(xū)用TortoiseSVN->Delete,
而不能用“Delete”键来删除文(wén)件(jiàn)或目录,尤其(qí)是对于(yú)目(mù)录的删除。
9.混合版本
Subversion的Working Copy被设(shè)计成一种能够(gòu)包含不(bú)同版本的文(wén)件共(gòng)存的形式。
比如(rú)F:\Project1是一个Working Copy,
该目录下有(yǒu)两个文件a.txt和b.txt。
执行Update命令,将Working Copy更新到最新版本(Revision 24)。
这(zhè)时,a.txt和b.txt的Revision都是24
(其实(shí)对于单个文件来说并不(bú)存在(zài)Revision,
Revision是对于整个Repository而言的,
这里(lǐ)所指的是Repository的Revision24所存储(chǔ)的(de)a.txt和b.txt,
但为了方(fāng)便而(ér)采用这种描述方式,请注意,下同(tóng))。
之后,你(nǐ)的同事(shì)修改了a.txt,并且提交了修改,
这(zhè)时Repository的Revision就变成25了。
注意,这时你没有再次执行(háng)Update,
因(yīn)此你的Working Copy的(de)Revision还是24。
这时(shí)你修改了b.txt文件,并提交修改。
因为Revision25并没有对b.txt文件进行修(xiū)改,
因(yīn)此你(nǐ)对b.txt文件(jiàn)的(de)修(xiū)改是基(jī)于b.txt文件(jiàn)最(zuì)新的版本(běn),
所以不(bú)会出现Conflict。
当你(nǐ)提交b.txt的修(xiū)改后,产(chǎn)生Revision26。
这时你会(huì)发(fā)现你的Working Copy中的a.txt文件并不(bú)是Revision25中的a.txt文件(jiàn),
它还是Revision24的a.txt文件,而你的b.txt文件是Revision26的b.txt文件。
也就(jiù)是(shì)说当你(nǐ)Commit时,你的(de)Working Copy中(zhōng)只有(yǒu)你提(tí)交的那些文(wén)件是最新(xīn)版本,
而其(qí)他没有修改(gǎi)的文件并不会更新为最新版本(běn)。
这样就(jiù)造成(chéng)了你的Working Copy由不同(tóng)的(de)Revision文件所组成
(Revision24的a.txt文件和Revision26的(de)b.txt文(wén)件(jiàn))。
前(qián)面说(shuō)过在提交修改前(qián)必须(xū)保证你是在文(wén)件的最新(xīn)版本基础上修改,
如果在这(zhè)种混合版(bǎn)本的(de)情况下,
怎样才(cái)能知道当前Working Copy中的文件(jiàn)是否为最新版本(běn)?
在前(qián)面所说的“.svn”目录中有一(yī)个文件名为“entries”的文件,
该文(wén)件记录了当前Working Copy中的每一个文件的Revision,
因此当(dāng)你Commit时,Subversion会从该文件中取得你提交(jiāo)文(wén)件的Revision,
再与Repository的最(zuì)新Revision一比较就可以知(zhī)道你修改的文(wén)件(jiàn)是否基于该文件(jiàn)的最新(xīn)版本(běn)。
10.文件(jiàn)的锁定
前(qián)面说过Subversion的版本控制模型是(shì)一种叫做Copy-Modify-Merge
(拷贝-修改-合(hé)并)的(de)模型。
该模型在对文(wén)本文件进行版(bǎn)本(běn)控制时工作的很好(hǎo),
但(dàn)是(shì)有些(xiē)需要进(jìn)行版本控制的文件并不是文本文件,
比如说图(tú)像(xiàng)文件,这种模型在这种情况(kuàng)下就(jiù)不能正常工作了,
因为文本文件(jiàn)可以合并,而二进制文(wén)件(jiàn)则无法(fǎ)合并。
所以Subversion从(cóng)1.2开始支持(chí)一种叫Lock-Modify-Unlock
(锁定-修改-解锁)的版本(běn)控制模型。
在Windows下最常用的版本控制软(ruǎn)件Visual Source Safe(VSS)就(jiù)是采(cǎi)用这种模型。
这种模型要求在对(duì)一个文件(jiàn)修改前首先要锁定这个文件,
然后才能修(xiū)改,这时,别人将(jiāng)无法(fǎ)对该文件进行修改,
当修(xiū)改完后再释(shì)放锁,使其(qí)他人可以对该文件进行锁定,然(rán)后修改。
锁定文(wén)件的方(fāng)法是:TortoiseSVN->Get Lock...再点OK按钮,
这(zhè)时就完成(chéng)了(le)对文件的锁定。
这时(shí),如果(guǒ)其他人想对文件进行锁定时,
Subversion会对他(tā)提示该文件已经被(bèi)别人锁定。
当(dāng)你修(xiū)改完文(wén)件后,然后单击右键,SVN Commit...,
将修改(gǎi)提交(jiāo),默认情况下,提交的(de)时候(hòu)就会对该文件解锁,
如果你(nǐ)想仍然锁定该文件,请(qǐng)在commit时弹(dàn)出(chū)的对话框中选(xuǎn)中keep lock复(fù)选框。
11.文件的(de)附加属(shǔ)性
在Subversion中,每个文(wén)件(jiàn)可(kě)以拥有(yǒu)一种叫做附加属性的(de)东西。
附加属性描述了该文件所拥有的一些特性。
Subversion已经预定义了一些附加(jiā)属(shǔ)性(xìng)
(这里(lǐ)只是指Subversion已经定义了一些附加属性的(de)“名称(chēng)”,
并不是指已(yǐ)经将这些属性附加在文件上了,
比如默认情况下文本文件一开始(shǐ)不含任何(hé)属性,
直到人(rén)为的对该文(wén)件添加附(fù)加属(shǔ)性),
并(bìng)且(qiě)你(nǐ)可以对文件添(tiān)加自定义的属性。
Subversion对待附加(jiā)属性就像(xiàng)对待文(wén)件(jiàn)内容一样,
当修改了一个文件的(de)附加属性(添加,改变,删除附加属(shǔ)性),
即使没有对文件(jiàn)的内容进行修(xiū)改,
同样可以Commit该(gāi)文件,就像更改了(le)文件内容那样,
Repository也会生成新的Revision,
所以从(cóng)某(mǒu)种意义上来说,
Subversion不区别对待文件的附(fù)加属性(xìng)的(de)修改和文件的(de)内容的修改(gǎi),
文件的附(fù)加(jiā)属性可以看成是一种特殊(shū)的文(wén)件内(nèi)容(róng)。
Subversion预定义了若干个附加(jiā)属性(xìng),
这里(lǐ)只讨论“svn:needs-lock”属(shǔ)性,
因为它(tā)与我们上面的文(wén)件锁(suǒ)定会产生的一个问题(tí)有关。
其他(tā)的属性可以参考(kǎo)Subversion自带的帮助文档。
考虑这(zhè)种情(qíng)况(kuàng),
张三和李四同时(shí)想对一(yī)个图(tú)片(piàn)文件a.jpg作修改,
张三在修改时先将该文件锁定,然后进行修(xiū)改,
同(tóng)时李四也开始(shǐ)对(duì)该文件进行修改,
但李四忘记了对非文本文件进行修改时应该先锁定该(gāi)文件。
张三(sān)首先(xiān)对(duì)该文件(jiàn)修改完毕,于是张三(sān)向服务器提交了他(tā)的修改。
之后,李(lǐ)四也完(wán)成了修改,当他(tā)提交修改时,
Subversion提示李四的文件版本不是最(zuì)新的,
在Commit之前应先更新(xīn)a.jpg到最新版(bǎn)本,
由(yóu)于图(tú)片(piàn)文件无法合并,
这就意味着张三和李四之间(jiān)必定有(yǒu)一个人的(de)修改会作废。
应用“svn:needs-lock”属性可以(yǐ)避免这(zhè)个问题。
当一个文件(jiàn)拥有“svn:needs-lock”属性(xìng)时,
该文件在没有锁定时,文件的图标是(shì)灰色(sè)的,
表示该(gāi)文件是一个只读(dú)文件(该(gāi)文件的(de)Windows只读属性的复(fù)选框为选中),
这个灰色的图标就会提醒想对该文(wén)件(jiàn)进行修改的人,
在修改该(gāi)文件之前应(yīng)该(gāi)首先(xiān)锁定该文件。
锁(suǒ)定该文件之后,文件(jiàn)的只读(dú)属性就会去掉了,
一旦释放掉锁,文件的(de)图标又(yòu)会变成灰色(sè),
文件也会变成只(zhī)读(dú)的了(le)。
李(lǐ)四在这种情况下就会避免在没有锁定文件时对文(wén)件进行修改。
对非文(wén)本文件添加“svn:needs-lock”
属性应该在将(jiāng)该文(wén)件第(dì)一次添加到Repository时就设置,
当然,一个文件可以在任意(yì)时刻添加附加属性,
这样做(zuò)是为了减少李(lǐ)四所(suǒ)遇(yù)到的那个(gè)问题发(fā)生的几率。
具(jù)体(tǐ)的方法(fǎ)是(shì):
首先将(jiāng)a.jpg文件拷贝到Working Copy中,
然后在该文件(jiàn)上单(dān)击右键,
TortoiseSVN->Add,告诉(sù)Subversion要将该文件(jiàn)纳入版本控制,
接着在(zài)该文件上(shàng)单击右(yòu)键并选中属性(xìng),
在弹出的属性对话框中选中Subversion页。
在下拉框中选中“svn:needs-lock”,
并在下面的文(wén)本框中填入“*”
(其实这里填什(shí)么(me)都无所谓,只要(yào)文件有“svn:needs-lock”附加属性(xìng)就行),
之后点(diǎn)Set按钮,“svn:needs-lock”附加(jiā)属性就设(shè)置好了。
然后执行Commit命令提交修改。
这时当(dāng)其他人执行Update时,
a.jpg就会添加到他们的Working Copy中,
并且文件的附加属性也会随(suí)文件一起(qǐ)被得到(dào)。
可以看到a.jpg此(cǐ)时的图标就是灰色的,
文(wén)件的Windows属性(xìng)也(yě)是只读的。
12.回到以前(qián)的版(bǎn)本
由于Subversion会记录你(nǐ)对Repository的每一次修(xiū)改,
因此能(néng)够很容易的获得Repository以前某一时刻的状态。
比如:现在Repository的最新Revision是(shì)56,
这时我想看看Repository在Revision24时(shí)的状态,
可以在(zài)本地(dì)的Working Copy中(zhōng)单击右键,
TortoiseSVN->Update to Revision...,
然后(hòu)输入你想要回复到的Revision号,点OK按钮。
回到(dào)以前的版本还(hái)有(yǒu)一种情况是我想将Repository的
最新Revision的状态与以(yǐ)前某一(yī)个Revision的(de)状态一模一(yī)样,
上面(miàn)那种方法(fǎ)就不适(shì)合,
上面的那(nà)种(zhǒng)方法只是将本地(dì)的Working Copy回复到以前的状态,
而服(fú)务器端的Repository并没有回到以(yǐ)前(qián)的状态。
将Repository的最新Revison的状(zhuàng)态回复到以前某(mǒu)个Revision的状态具体的方法是:
先执(zhí)行Update命令将Working Copy更新到(dào)最新(xīn)的(de)Revision,
然(rán)后在(zài)Working Copy中单击(jī)右键,
TortoiseSVN->Show Log,
弹出的(de)Log Messages窗口中会(huì)显示该(gāi)Repository的所有Revision,
选中最新(xīn)的(de)Revision,之后(hòu)按住Shift键,
再单击你想回复到的Revision+1的那个Revision
(比如Repository的最新Revision是30,
你想将Repository的状态回复到Revision16,
那么就选中(zhōng)Revision30,再按住Shift键,
选中Revision17,
就是说选中Revision17到Revision30之间的所有Revision)。
然(rán)后在选中的Revision上(shàng)单(dān)击右键,
选(xuǎn)中(zhōng)“Revert changes from these revision”。
再点Yes按钮,就可以将(jiāng)Working Copy的状态回复(fù)到目标Revision。
注意,此时只是Working Copy回复到(dào)目标Revision,
之(zhī)后应该用Commit提交修改,
这样Repository最新状态就与目标Revision的状(zhuàng)态一样了。
这两种回复到以前(qián)版本的方式(shì)截然(rán)不同(tóng),
第一种(zhǒng)方式(shì)是将(jiāng)整个(gè)Working Copy回复到某个Revision,
也就(jiù)是(shì)说(shuō)这种方式Working Copy中的“.svn”目录所存的文件副本也与目(mù)标Revision的一(yī)模一样,
如果这时你没有修改文(wén)件,你将不(bú)能执行Commit命令。
而第二种方式客户(hù)端Working Copy中的
“.svn”目录(lù)所存的副本始(shǐ)终(zhōng)是最新的Revision的文件(jiàn)副(fù)本
(这里我们(men)基于(yú)一个假设(shè):在Update之后没有其他人对Repository做修改)。
这种方式就像是(shì)我们(men)自己手工(gōng)将Working Copy的文件状态(tài)修改为目标Revision,
在修改(gǎi)之后提交修改一样。
13.查看修改
有时我们对(duì)Working Copy的许多文件进行(háng)了修改,
这些文件(jiàn)位于不同(tóng)的子目录,我们(men)就可以在Working Copy的最上层目录单击右键(jiàn),
TortoiseSVN->Check For Modifications,
弹出的对话框就会(huì)显示你所做的所有修改明(míng)细。
还有一种情况(kuàng)是我们的(de)Working Copy已经很久没有执(zhí)行Update命(mìng)令,
我们想看看Working Copy中(zhōng)有哪些文件已经发生修改了,
这(zhè)时就(jiù)可以在Working Copy的最上层目录(lù)单击右键,
TortoiseSVN->Check For Modifications,
在弹出的对话框点(diǎn)击Check Repository按钮后,
就会显示服务器端已经修改了的文件。
该方法还有一个用途(tú)就(jiù)是查看(kàn)文件的锁(suǒ)定,
当你想锁定一个(gè)文(wén)件时,你(nǐ)想先看看这(zhè)个文件有(yǒu)没有被别人锁定,
点击Check Repository按钮会(huì)显示服务(wù)器端(duān)Repository所有被锁(suǒ)定的文(wén)件,
如果你想(xiǎng)锁定的文件(jiàn)不在这里面,那(nà)就说(shuō)明该文件(jiàn)目(mù)前没(méi)有人锁定。
