關(guān)于svn使用教程的信息
Revision25并沒(méi)有對(duì)b.txt文件進(jìn)行修改,
因此你對(duì)b.txt文件的修改是基于b.txt文件最新的版本,
所以不會(huì)出現(xiàn)Conflict。
當(dāng)你提交b.txt的修改后,產(chǎn)生Revision26。
這時(shí)你會(huì)發(fā)現(xiàn)你的Working Copy中的a.txt文件并不是Revision25中的a.txt文件,
它還是Revision24的a.txt文件,而你的b.txt文件是Revision26的b.txt文件。
也就是說(shuō)當(dāng)你Commit時(shí),你的Working Copy中只有你提交的那些文件是最新版本,
而其他沒(méi)有修改的文件并不會(huì)更新為最新版本。
這樣就造成了你的Working Copy由不同的Revision文件所組成
(Revision24的a.txt文件和Revision26的b.txt文件)。
前面說(shuō)過(guò)在提交修改前必須保證你是在文件的最新版本基礎(chǔ)上修改,
如果在這種混合版本的情況下,
怎樣才能知道當(dāng)前Working Copy中的文件是否為最新版本?
在前面所說(shuō)的“.svn”目錄中有一個(gè)文件名為“entries”的文件,
該文件記錄了當(dāng)前Working Copy中的每一個(gè)文件的Revision,
因此當(dāng)你Commit時(shí),Subversion會(huì)從該文件中取得你提交文件的Revision,
再與Repository的最新Revision一比較就可以知道你修改的文件是否基于該文件的最新版本。
10.文件的鎖定
前面說(shuō)過(guò)Subversion的版本控制模型是一種叫做Copy-Modify-Merge
(拷貝-修改-合并)的模型。
該模型在對(duì)文本文件進(jìn)行版本控制時(shí)工作的很好,
但是有些需要進(jìn)行版本控制的文件并不是文本文件,
比如說(shuō)圖像文件,這種模型在這種情況下就不能正常工作了,
因?yàn)槲谋疚募梢院喜ⅲM(jìn)制文件則無(wú)法合并。
所以Subversion從1.2開(kāi)始支持一種叫Lock-Modify-Unlock
(鎖定-修改-解鎖)的版本控制模型。
在Windows下最常用的版本控制軟件Visual Source Safe(VSS)就是采用這種模型。
這種模型要求在對(duì)一個(gè)文件修改前首先要鎖定這個(gè)文件,
然后才能修改,這時(shí),別人將無(wú)法對(duì)該文件進(jìn)行修改,
當(dāng)修改完后再釋放鎖,使其他人可以對(duì)該文件進(jìn)行鎖定,然后修改。
鎖定文件的方法是:TortoiseSVN-Get Lock...再點(diǎn)OK按鈕,
這時(shí)就完成了對(duì)文件的鎖定。
這時(shí),如果其他人想對(duì)文件進(jìn)行鎖定時(shí),
Subversion會(huì)對(duì)他提示該文件已經(jīng)被別人鎖定。
當(dāng)你修改完文件后,然后單擊右鍵,SVN Commit...,
將修改提交,默認(rèn)情況下,提交的時(shí)候就會(huì)對(duì)該文件解鎖,
如果你想仍然鎖定該文件,請(qǐng)?jiān)赾ommit時(shí)彈出的對(duì)話框中選中keep lock復(fù)選框。
11.文件的附加屬性
在Subversion中,每個(gè)文件可以擁有一種叫做附加屬性的東西。
附加屬性描述了該文件所擁有的一些特性。
Subversion已經(jīng)預(yù)定義了一些附加屬性
(這里只是指Subversion已經(jīng)定義了一些附加屬性的“名稱”,
并不是指已經(jīng)將這些屬性附加在文件上了,
比如默認(rèn)情況下文本文件一開(kāi)始不含任何屬性,
直到人為的對(duì)該文件添加附加屬性),
并且你可以對(duì)文件添加自定義的屬性。
Subversion對(duì)待附加屬性就像對(duì)待文件內(nèi)容一樣,
當(dāng)修改了一個(gè)文件的附加屬性(添加,改變,刪除附加屬性),
即使沒(méi)有對(duì)文件的內(nèi)容進(jìn)行修改,
同樣可以Commit該文件,就像更改了文件內(nèi)容那樣,
Repository也會(huì)生成新的Revision,
所以從某種意義上來(lái)說(shuō),
Subversion不區(qū)別對(duì)待文件的附加屬性的修改和文件的內(nèi)容的修改,
文件的附加屬性可以看成是一種特殊的文件內(nèi)容。
Subversion預(yù)定義了若干個(gè)附加屬性,
這里只討論“svn:needs-lock”屬性,
因?yàn)樗c我們上面的文件鎖定會(huì)產(chǎn)生的一個(gè)問(wèn)題有關(guān)。
其他的屬性可以參考Subversion自帶的幫助文檔。
考慮這種情況,
張三和李四同時(shí)想對(duì)一個(gè)圖片文件a.jpg作修改,
張三在修改時(shí)先將該文件鎖定,然后進(jìn)行修改,
同時(shí)李四也開(kāi)始對(duì)該文件進(jìn)行修改,
但李四忘記了對(duì)非文本文件進(jìn)行修改時(shí)應(yīng)該先鎖定該文件。
張三首先對(duì)該文件修改完畢,于是張三向服務(wù)器提交了他的修改。
之后,李四也完成了修改,當(dāng)他提交修改時(shí),
Subversion提示李四的文件版本不是最新的,
在Commit之前應(yīng)先更新a.jpg到最新版本,
由于圖片文件無(wú)法合并,
這就意味著張三和李四之間必定有一個(gè)人的修改會(huì)作廢。
應(yīng)用“svn:needs-lock”屬性可以避免這個(gè)問(wèn)題。
當(dāng)一個(gè)文件擁有“svn:needs-lock”屬性時(shí),
該文件在沒(méi)有鎖定時(shí),文件的圖標(biāo)是灰色的,
表示該文件是一個(gè)只讀文件(該文件的Windows只讀屬性的復(fù)選框?yàn)檫x中),
這個(gè)灰色的圖標(biāo)就會(huì)提醒想對(duì)該文件進(jìn)行修改的人,
在修改該文件之前應(yīng)該首先鎖定該文件。
鎖定該文件之后,文件的只讀屬性就會(huì)去掉了,
一旦釋放掉鎖,文件的圖標(biāo)又會(huì)變成灰色,
文件也會(huì)變成只讀的了。
李四在這種情況下就會(huì)避免在沒(méi)有鎖定文件時(shí)對(duì)文件進(jìn)行修改。
對(duì)非文本文件添加“svn:needs-lock”
屬性應(yīng)該在將該文件第一次添加到Repository時(shí)就設(shè)置,
當(dāng)然,一個(gè)文件可以在任意時(shí)刻添加附加屬性,
這樣做是為了減少李四所遇到的那個(gè)問(wèn)題發(fā)生的幾率。
具體的方法是:
首先將a.jpg文件拷貝到Working Copy中,
然后在該文件上單擊右鍵,
TortoiseSVN-Add,告訴Subversion要將該文件納入版本控制,
接著在該文件上單擊右鍵并選中屬性,
在彈出的屬性對(duì)話框中選中Subversion頁(yè)。
在下拉框中選中“svn:needs-lock”,
并在下面的文本框中填入“*”
(其實(shí)這里填什么都無(wú)所謂,只要文件有“svn:needs-lock”附加屬性就行),
之后點(diǎn)Set按鈕,“svn:needs-lock”附加屬性就設(shè)置好了。
然后執(zhí)行Commit命令提交修改。
這時(shí)當(dāng)其他人執(zhí)行Update時(shí),
a.jpg就會(huì)添加到他們的Working Copy中,
并且文件的附加屬性也會(huì)隨文件一起被得到。
可以看到a.jpg此時(shí)的圖標(biāo)就是灰色的,
文件的Windows屬性也是只讀的。
12.回到以前的版本
由于Subversion會(huì)記錄你對(duì)Repository的每一次修改,
因此能夠很容易的獲得Repository以前某一時(shí)刻的狀態(tài)。
比如:現(xiàn)在Repository的最新Revision是56,
這時(shí)我想看看Repository在Revision24時(shí)的狀態(tài),
可以在本地的Working Copy中單擊右鍵,
TortoiseSVN-Update to Revision...,
然后輸入你想要回復(fù)到的Revision號(hào),點(diǎn)OK按鈕。
回到以前的版本還有一種情況是我想將Repository的
最新Revision的狀態(tài)與以前某一個(gè)Revision的狀態(tài)一模一樣,
上面那種方法就不適合,
上面的那種方法只是將本地的Working Copy回復(fù)到以前的狀態(tài),
而服務(wù)器端的Repository并沒(méi)有回到以前的狀態(tài)。
將Repository的最新Revison的狀態(tài)回復(fù)到以前某個(gè)Revision的狀態(tài)具體的方法是:
先執(zhí)行Update命令將Working Copy更新到最新的Revision,
然后在Working Copy中單擊右鍵,
TortoiseSVN-Show Log,
彈出的Log Messages窗口中會(huì)顯示該Repository的所有Revision,
選中最新的Revision,之后按住Shift鍵,
再單擊你想回復(fù)到的Revision+1的那個(gè)Revision
(比如Repository的最新Revision是30,
你想將Repository的狀態(tài)回復(fù)到Revision16,
那么就選中Revision30,再按住Shift鍵,
選中Revision17,
就是說(shuō)選中Revision17到Revision30之間的所有Revision)。
然后在選中的Revision上單擊右鍵,
選中“Revert changes from these revision”。
再點(diǎn)Yes按鈕,就可以將Working Copy的狀態(tài)回復(fù)到目標(biāo)Revision。
注意,此時(shí)只是Working Copy回復(fù)到目標(biāo)Revision,
之后應(yīng)該用Commit提交修改,
這樣Repository最新?tīng)顟B(tài)就與目標(biāo)Revision的狀態(tài)一樣了。
這兩種回復(fù)到以前版本的方式截然不同,
第一種方式是將整個(gè)Working Copy回復(fù)到某個(gè)Revision,
也就是說(shuō)這種方式Working Copy中的“.svn”目錄所存的文件副本也與目標(biāo)Revision的一模一樣,
如果這時(shí)你沒(méi)有修改文件,你將不能執(zhí)行Commit命令。
而第二種方式客戶端Working Copy中的
“.svn”目錄所存的副本始終是最新的Revision的文件副本
(這里我們基于一個(gè)假設(shè):在Update之后沒(méi)有其他人對(duì)Repository做修改)。
這種方式就像是我們自己手工將Working Copy的文件狀態(tài)修改為目標(biāo)Revision,
在修改之后提交修改一樣。
13.查看修改
有時(shí)我們對(duì)Working Copy的許多文件進(jìn)行了修改,
這些文件位于不同的子目錄,我們就可以在Working Copy的最上層目錄單擊右鍵,
TortoiseSVN-Check For Modifications,
彈出的對(duì)話框就會(huì)顯示你所做的所有修改明細(xì)。
還有一種情況是我們的Working Copy已經(jīng)很久沒(méi)有執(zhí)行Update命令,
我們想看看Working Copy中有哪些文件已經(jīng)發(fā)生修改了,
這時(shí)就可以在Working Copy的最上層目錄單擊右鍵,
TortoiseSVN-Check For Modifications,
在彈出的對(duì)話框點(diǎn)擊Check Repository按鈕后,
就會(huì)顯示服務(wù)器端已經(jīng)修改了的文件。
該方法還有一個(gè)用途就是查看文件的鎖定,
當(dāng)你想鎖定一個(gè)文件時(shí),你想先看看這個(gè)文件有沒(méi)有被別人鎖定,
點(diǎn)擊Check Repository按鈕會(huì)顯示服務(wù)器端Repository所有被鎖定的文件,
如果你想鎖定的文件不在這里面,那就說(shuō)明該文件目前沒(méi)有人鎖定。
詞條內(nèi)容僅供參考,如果您需要解決具體問(wèn)題
(尤其在法律、醫(yī)學(xué)等領(lǐng)域),建議您咨詢相關(guān)領(lǐng)域?qū)I(yè)人士。