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