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