TortoiseSVN客戶端常用命令詳解
1杆逗、Checkout拉取
首先要Checkout服務(wù)器端的Repository综看,
所謂的Checkout就是指獲得服務(wù)器端指定的Repository存儲的所有文件。
Checkout的具體方式是:
在客戶端新建一個空目錄,比如:F:\Project1(確保是空的)
在該目錄上單擊右鍵苟耻,在彈出式菜單中選中SVN Checkout...撼短,
之后按要求錄入內(nèi)容:
然后點OK踩寇,會彈出一個認證對話框框沟,
輸入用戶名和密碼牍氛。
點OK后就完成了對Repository的Checkout晨继。
檢出后,所有檢出文件上都打著綠色對勾:
命令方式檢出
1:在DOS命令中輸入需要檢出的目錄:http://192.168.1.210:8081/svn/svnproject/Knowledge
2:其中搬俊,
意思是紊扬,檢出文檔是放在D盤的根目錄下,是檢出文檔的存放位置唉擂,如下圖:
2餐屎、update更新
獲取版本庫中最新版本,具體的方法是:在WC目錄上單擊右鍵玩祟,SVN Update腹缩。
這時WC中的文件就是最新的版本了空扎。
3、commit提交上傳
commit功能就是將你本地的文件修改記錄上傳到服務(wù)器上面转锈,可以理解為上傳。
只會上傳原先checkout然后又被修改了的文件宴抚,假如你新加入了某些文件勒魔,需要右鍵點擊文件選擇Add菇曲,然后文件上面會出現(xiàn)一個加號冠绢,在下次commit的時候才能選到該文件。
commit頁面:
注意:commit的時候常潮,最好填寫Log信息弟胀,
Log內(nèi)容包括:修改了哪些東西及為什么做這些修改(what+why)
強制必須錄入log: property 中設(shè)置錄入log最小長度,此時commit必須錄入log,否則不允許提交.
設(shè)置錄入log最小長度頁面:
4喊式、add
將要添加的文件或者目錄拷貝到WC下孵户,
然后在該文件或目錄上單擊右鍵,TortoiseSVN->Add岔留,點OK夏哭。
如果添加了不止一個文件或目錄,
則鼠標不要在WC中點中任何文件献联,
然后單擊右鍵竖配,TortoiseSVN->Add,
就可以添加多個文件或目錄里逆。
這時文件的狀態(tài)圖標會發(fā)生如下變化:
?Add命令只是告訴本地的WC將該文件納入版本管理进胯,
并沒有將這個改變提交到服務(wù)器端,
在F:\Project1下單擊右鍵原押,SVN Commit...胁镐,
將你所做的修改提交到Repository。
5诸衔、modify
用文本編輯器或IDE對文件修改后盯漂,
文件的狀態(tài)圖標會變化,
然后單擊右鍵笨农,SVN Commit...即可提交修改宠能。
6、revert
(1)磁餐、放棄未提交的修改违崇,
單擊右鍵,TortoiseSVN->Revert诊霹,
本地的WC中的文件和目錄會恢復到修改前的狀態(tài)脾还。
(2)、回復到之前某個revision狀態(tài):
?a嗤谚、 在本地WC中單擊右鍵巩步,TortoiseSVN->Update to Revision...椅野,
然后輸入你想要回復到的Revision號
點OK按鈕竟闪。此時僅僅是WC中回復到特定版本炼蛤,對Repository沒有任何影響理朋。
?b暗挑、把Repository回復到某個revision狀態(tài)方法:
方法一:
先執(zhí)行Update命令將Working Copy更新到最新的Revision炸裆,
然后在Working Copy中單擊右鍵,
?TortoiseSVN->Show Log洛史,
彈出的Log Messages窗口中會顯示該Repository的所有Revision也殖,
選中最新的Revision忆嗜,之后按住Shift鍵捆毫,
再單擊你想回復到的Revision+1的那個Revision
(比如Repository的最新Revision是79绩卤,
你想將Repository的狀態(tài)回復到Revision60,
那么就選中Revision70陶夜,再按住Shift鍵律适,
選中Revision61遏插,
就是說選中Revision61到Revision79之間的所有Revision)厂僧。
然后在選中的Revision上單擊右鍵颜屠,
選中“Revert changes from these revision”甫窟。
再點Yes按鈕粗井,就可以將WC的狀態(tài)回復到目標Revision60浇衬。
?注意:此時只是WC回復到目標Revision耘擂,之后應該用Commit提交修改醉冤,
這樣Repository最新狀態(tài)就與WC的狀態(tài)一致冤灾,都為?Revision60韵吨。
方法二:
采取大版本號向小版本號merge的方式椿疗,進行回滾?保證我們拿到的是最新代碼届榄,TortoiseSVN右鍵àmerge,如果我們最新版本為79铝条,要回滾到60班缰,如下圖埠忘,“From”的URL和“to”的URL均了錄入要回復的文件在版本庫的存放地址
??點“merge”,然后commit即可莹妒。
7旨怠、delete
刪除文件時鉴腻,選中要刪除的文件或目錄谋梭,
單擊右鍵瓮床,TortoiseSVN->Delete
然后提交修改隘庄。
注意千萬不要用windows自己的“刪除”或者“Delete”鍵來刪除文件丑掺,否則將無法提交你的修改兼丰。
這一點對目錄的刪除來說尤為重要。因為每個目錄里有個.svn隱藏目錄 黍翎,存放目錄下文件的信息匣掸,使用操作系統(tǒng)命令delete/move時碰酝,??.svn還指向原來的位置砰粹,所作操作不受SVN控制。
8饭入、move
移動方法:
(1)爽航、選擇你要移動的文件或目錄
(2)讥珍、拖拽(right-drag)他們到新的工作副本下衷佃,
(3)氏义、松開鼠標右鍵
(4)惯悠、在彈出菜單選擇上下文菜單→?SVN 移動文件克婶。
原理同上萝风。
9规惰、Branche/Tag ??
操作方法:
創(chuàng)建分支非常簡單歇万,只需在需要創(chuàng)建分支的工作目錄上贪磺,使用TortoiseSVN→?Branch/Tag命令寒锚,在"To URL" 項指定待創(chuàng)建的分支 url 即可
實現(xiàn)本質(zhì):
subversion對分支和標簽是通過復制一份最新的版本庫的快照來實現(xiàn)的。
一般情況下雌桑,tag拣技,是用來做一個milestone的膏斤,不管是不是release莫辨,都是一個可用的版本衔掸。這里應該是只讀的,更多的是一個顯示用的,給人一個可讀(readable)的標記磷斧;branch弛饭,是用來做并行開發(fā)的侣颂,這里的并行是指和trunk進行比較藻肄。
分支與標簽的區(qū)別:
在實現(xiàn)上嘹屯,branch和tag州弟,對于svn都是使用copy實現(xiàn)的婆翔,所以他們在默認的權(quán)限上和一般的目錄沒有區(qū)別浙滤。至于何時用tag纺腊,何時用branch揖膜,完全由人主觀的根據(jù)規(guī)范和需要來選擇壹粟,而不是強制的(比如cvs)趁仙,一個不去做任何的修改的分支就是版本庫某一時刻的一個快照雀费,相當于為某一個版本做了一個標簽
Branch和Tag都是拷貝指向原始文件的鏈接盏袄,當你對拷貝做修改時,記錄為相對原始文件的修改逛尚,稱為延遲拷貝绰寞,效率高且?guī)缀醪徽加每臻g克握。
Tag:版本號是個好東西菩暗,但是我們更傾向于記住像第二預覽發(fā)布版這樣的名字,而不是V01這樣的數(shù)字掏熬,標簽是用來做這件事情的旗芬。版本控制系統(tǒng)可以讓你給某一個時刻的一組文件或者一些目錄或者整個項目分配一個名字幔嫂。如果你給某幾個文件分配標簽“第二發(fā)布預覽版”誊薄,以后就能使用這個標簽簽出它們切心。
標簽是一種很好地跟中項目代碼開發(fā)過程中發(fā)生的重要事件的方式绽昏。
分支合并:
使用TortoiseSVN→?Merge命令全谤,在“ From:(start URL and revision of the range to merge) ”中選擇希望合并的目錄 ( 如: trunk) 啼县,并指定希望合并的開始 revision 編號,在“ To:(end URL and revision of the range to merge) ”中選擇結(jié)束 revision 編號卷胯。
然后點擊“ merge ”完成合并操作窑睁,剩下的工作就是編輯沖突了担钮。當然運氣好的話是不需要這個過程滴狭姨。值得注意的是苏遥,“ From: ”和“ To: ”中的 URL 通常是相同的田炭,切記不要與創(chuàng)建分支時的含義混淆
10教硫、get lock/release lock
選擇工作副本中你想要獲取鎖定的文件挤安,然后選擇命令TortoiseSVN ---> Get lock…
出現(xiàn)一個對話框蛤铜,允許你輸入注釋围肥,這樣別人知道你為什么鎖定這個文件。注釋是可選的杠步,
并且只用于基于Subversion 的庫。選擇需要鎖定的文件在復選框打勾谬盐,點擊“確定”按鈕
鎖定選擇的文件:
出現(xiàn)一個對話框飞傀,輸入正確的用戶名和密碼即可向版本庫提交你想鎖定文件的信息。
鎖定文件成功幢痘!返回信息!”Locked by admin”表示文件已被admin 用戶鎖
定员舵;”alpay_payto.php”表示鎖定文件的名稱庄拇。點擊”O(jiān)K”按鈕確定鎖定文件成功措近。
釋放鎖定(取消鎖定)
選擇工作副本中你想要取消鎖定的文件瞭郑,然后選擇命令TortoiseSVN ---> Release lock…
之后操作同get lock。
當被鎖定文件commit后鸭你,會自動解鎖屈张,無需再去解鎖;如果commit后還需上鎖袱巨,則在commit時可選擇:“keep lock”
強制鎖定:設(shè)置對象文件svn:needs-lock這個屬性阁谆,update后強制文件的屬性為只讀,只有l(wèi)ock之后愉老,才能對文件進行修改操作场绿,commit-release lock之后,又自動變成只讀嫉入。
具體做法:
先將a.jpg文件拷貝到WC中,然后在該文件上單擊右鍵件甥,
?TortoiseSVN->Add,告訴Subversion要將該文件納入版本控制,
接著在該文件上單擊右鍵并選中屬性,
在彈出的屬性對話框中選中Edit鍵,在property name中如下圖。
在下拉框中選中“svn:needs-lock”,
并在下面的文本框中填入“*”
(其實這里填什么都無所謂涵紊,只要文件有“svn:needs-lock”附加屬性就行),
之后點Set按鈕,“svn:needs-lock”附加屬性就設(shè)置好了。
然后執(zhí)行Commit命令提交修改。
這時當其他人執(zhí)行Update時,
?a.jpg就會添加到他們的WC中,
并且文件的附加屬性也會隨文件一起被得到。
可以看到a.jpg此時的圖標就是灰色的,
文件的Windows屬性也是只讀的
11鉴分、clean up
SVN 本地更新時,由于一些操作中斷更新,如磁盤空間不夠,用戶取消,
可能會造成本地文件被鎖定的情況裁奇。一般出現(xiàn)這種情況的解決方法:
(1)音五、可以使用SVN clean up來清除鎖定诞挨。
(2)银室、如果不是本目錄鎖定汽抚,系統(tǒng)提示上一層目錄鎖定,需要到上一層或者根目錄中清除。
(3).如果在根目錄下都無法clean的話酌畜,一般采取的方法是另外找一個目錄重新check out。但有時SVN目錄下可能有一些自己本地修改的文件,還未提交到SVN服務(wù)器咽袜,這時重新check out需要注意本地文件的備份凹联,并且不要強制覆蓋服務(wù)器上其它人修改的內(nèi)容偶惠。
(4)出革、如果覺得第3種很麻煩旨枯,可以考慮這樣的方法遮精。其實SVN加鎖會在.SVN(隱藏文件)中生成一個名字叫l(wèi)ock的文件(無后綴)添怔,查找所有的手工刪除畅铭。然后再嘗試更新耗帕,系統(tǒng)可能會提示某個.base文件無法訪問。找到它雳殊,把相關(guān)的文件或其所在的目錄刪除,重新update驾锰。工作量就小多了。
12、export
集成測試或項目上線需要版本時,使用export而不用checkout,export 得到干凈的目錄與文件,不帶版本控制因素寸五。
13、Check for modifications
同服務(wù)器上的項目版本進行比較十性,并可做相應的修改。
14支示、Show log
查看版本日志及不同版本間相互比較
15浓冒、Revision Graph
版本示意圖
16宵溅、Repo-Browser
查看當前版本庫,這是TortoiseSVN查看版本庫的入口上炎,通過這個菜單項恃逻,我們就可以進入配置庫的資源管理器,然后就可以對配置庫的文件夾進行各種管理藕施,相當于我們打開我的電腦進行文件管理一樣
17寇损、Rename
SVN支持文件改名,點擊Rename,彈出文件名稱輸入框,輸入新的文件名稱,點擊確定,再把修改提交,即可完成文件改名。
18裳食、switch與relocate
版本庫轉(zhuǎn)移矛市,當我們版本庫發(fā)生轉(zhuǎn)移的時候就需要用到這個功能。例如我原先的版本庫是建在U盤上的诲祸,現(xiàn)在轉(zhuǎn)移到(復制整個配置庫文件夾)開發(fā)服務(wù)器上浊吏,使用https代替文件系統(tǒng)的訪問。因此就需要將原來的工作拷貝的目標版本庫重新定位到開發(fā)服務(wù)器上救氯。
注意:relocate與switch的區(qū)別:
(1)找田、如果WC反應相同的版本庫目錄,但是版本庫本身位置改變了着憨,使用relocate;
(2)墩衙、如果WC需要反應一個版本庫的新目錄,素要switch甲抖。
19漆改、switch與svn update比較:
svn switch和svn update的輸出很像,switch命令只是update命令的一個超集准谚。當你運行svn update時挫剑,會告訴版本庫比較兩個目錄樹,版本庫這樣做柱衔,并且返回給客戶區(qū)別的描述樊破,svn switch和svn update兩個命令唯一區(qū)別就是update會一直比較同一路徑。也就是了秀存,如果你的工作拷貝是/calc/trunk的一個鏡像捶码,當運行svn update時會自動地比較你的工作拷貝的/calc/trunk與HEAD版本的/calc/trunk。如果你使用svn switch跳轉(zhuǎn)工作拷貝到分支或链,則會比較你的工作拷貝的/calc/trunk與相應分支目錄的HEAD版本。換句話說档押,一個更新通過時間移動你的工作拷貝澳盐,一個轉(zhuǎn)換通過時間和空間移動工作拷貝祈纯。因為svn switch是svn update的一個變種,具有相同的行為叼耙,當新的數(shù)據(jù)到達時腕窥,任何工作拷貝的已經(jīng)完成的本地修改會被保存,這里允許你作各種聰明的把戲
20筛婉、diff:
(下面是針對同一個文件而言)原本錯誤地理解了diff 的意思是比較本地的文件與服務(wù)器的相應文件有什么不同簇爆,但實際意思并非這樣。更準確地說這條語句的意思是比較一個文件中你修改過的部分與服務(wù)器的相應文件相應部分有什么不同爽撒,對于那些沒有修改過的地方(同一文件中)不同也不會比較入蛆,當然可以先up 一下再 svn diff? 這樣就保證了本地文件與服務(wù)器的相應文件的所有不同的地方全都顯示出來了,當然沖突情況除外.
21硕勿、dry run
合并前看看結(jié)果會是什么樣的.一個簡單的辦法就是運行dry run先看看哨毁,并不真實的將結(jié)果寫入到工作副本中.它只是顯示在合并過程中輸出的執(zhí)行結(jié)果狀態(tài)碼.比較'高級'的預言合并,當運行svn diff可能會給出太多的詳細日志.
22、create/apply patch
(1)源武、使用create patch可以生成一個或者多個修改過的文件和當前版本差異的patch(支持目錄樹) 通常情況下扼褪,create patch將修改保存為.patch或.diff文件 可以將.patch或.diff文件的內(nèi)容復制出來,發(fā)給需要審查的人 .patch或.diff文件中記錄了發(fā)生這個patch的版本號以及具體修改的內(nèi)容 針對某個文件或某幾個文件的若干種修改粱栖,可以生成多個.patch或.diff文件 (2)话浇、apply patch 可以將.patch或.diff文件應用到對應版本的項目,就像打補丁一樣
同一個項目/文件夾下闹究,可以選擇應用需要的patch
通常來說凳枝,應用一個patch時文件版本和生成這個patch時文件的版本是一致的;如果不一致跋核,也可以強制應用岖瑰,svn會自動進行diff(這時候需要手動合并)
linux下,可以使用系統(tǒng)的patch命令來應用patch砂代,eg: patch -p0 <xxx.patch
(3)蹋订、使用
暫時不需要提交或不允許提交的修改,可以選擇create patch來保存修改的內(nèi)容
選擇create patch來保存修改的內(nèi)容并且提交patch刻伊,通過審查后露戒,(在服務(wù)器端)應用patch
當一個功能有多種解決方案時,可以生成多個patch捶箱,(提交后)分別經(jīng)過測試智什,再決定應用哪個patch
多個功能分別需要改同一個文件的不同地方(即沒有同一行),可以做成多個patch丁屎,應用patch的順序沒有要求(在linux下應用也一樣成功荠锭,只是會生成多個.orig文件)
多個連續(xù)性的功能,他們修改的文件都與一個base作patch晨川,例:p1在v1的基礎(chǔ)上開發(fā)v2证九,生成v2和v1之間的patch1删豺;p2在v2的基礎(chǔ)上開發(fā)v3,生成v3和v1之間的patch2愧怜,這樣只要應用patch2也就應用了patch1呀页。
(4)、帶來的問題
一個較早的patch拥坛,在經(jīng)過多輪提交后蓬蝶,如果想再要應用,需要嚴格的diff
如果兩個patch分別改了同一行代碼猜惋,應用第一個patch后要再應用第二個patch時丸氛,仍然需要diff。如果在linux下惨奕,會產(chǎn)生沖突雪位,生成.orig和.rej兩個文件(此時仍然需要手動進行比較合并)
第3部分提到的連續(xù)性,要準確的預見到梨撞,比較困難
第3部分提到的多個連續(xù)的功能雹洗,后做的功能的某個文件更新了先做的功能的內(nèi)容,但先做的功能可能還涉及到其他文件卧波,容易造成漏更新文件的情況
23时肿、subversion的版本控制模型
當你用subversion進行版本控制時,
?Subversion會記錄你對Repository進行的每一次修改(包括添加港粱,修改螃成,刪除等等),
每修改一次Repository都會產(chǎn)生一個新的Revision(修訂版本號)查坪,
不同的Revision代表了不同時刻Repository的狀態(tài)寸宏,
因此我們可以用這個Revision回朔任意時刻Repository的狀態(tài),
就像時間機器一樣偿曙,也就是說某一Revision
就是Repository在某一時刻的一個“快照”氮凝。
注意:Revision不是針對某一個文件或者目錄,
而是針對整個Repository而言的望忆。
每修改一次Repository罩阵,Revision 都會增加1。
?Subversion的版本控制模型是一種叫做Copy-Modify-Merge
?(拷貝-修改-合并)的模型启摄。
考慮這種情況:
張三和李四是公司同一個部門的同事稿壁,
他們共同維護一個文本文件a.txt,
并且對該文件進行版本控制歉备,
因此他們把這個文件放到一個Repository上共同維護該文件傅是。
周一上午9點,張三和李四同時想對a.txt文件進行修改,
于是他們同時從Repository上取得該文件的最新版本(Revision 10)落午,
然后進行修改谎懦。過了三分鐘肚豺,張三首先完成了修改溃斋,
他在該文件的第五行修改了一個單詞的拼寫(將Typo改為Type),
于是張三對修改后的文件執(zhí)行Commit命令吸申,
將修改提交到服務(wù)器端的Repository中梗劫。
這時Repository的Revision變?yōu)?1。
六分鐘過后截碴,李四也完成了他的修改梳侨,
他修改了該文件第十行上的一個單詞拼寫(將He改為She),
于是他也對修改后的文件執(zhí)行Commit命令日丹,
這時Subversion 在提交修改時會發(fā)現(xiàn)走哺,
李四修改的文件是Revision10的a.txt文件,
而不是最新的Revision 11的a.txt文件哲虾。
于是丙躏,Subversion 提示李四在提交修改前,
應該先將Working Copy更新到最新版本束凑,
李四執(zhí)行Update命令將Working Copy更新到Revision 11晒旅,
這時Subversion會提示已經(jīng)完成合并,
李四的a.txt文件的第五行的“Typo”已經(jīng)變?yōu)榱恕癟ype”汪诉,
第十行還是“She”废恋,就是說Subversion已經(jīng)將張三的修改“合并”到李四的a.txt文件中了。
之后扒寄,李四再執(zhí)行Commit命令鱼鼓,就能將他對第十行的修改(將He改為She)
提交到服務(wù)器端的Repository中了(生成Revision 12)。
但是這種合并在某些情況下會變得復雜一些该编,
比如:李四對a.txt文件的修改并不是第十行迄本,
而是與張三同樣修改第五行的單詞,
李四將“Typo”改為“Typr”上渴,并且提交修改岸梨,
這時Subversion會提示李四在提交修改前,
應該先將Working Copy更新到最新版本稠氮,
李四執(zhí)行Update命令將Working Copy更新到Revision 11曹阔,
這時Subversion將Revision11的a.txt文件與
李四修改的a.txt文件進行合并時發(fā)現(xiàn)李四修改的同樣是第五行,
于是Subversion就無法判斷是李四的修改(“Tpyr”)
正確還是張三的修改(“Type”)正確隔披,
因為他們都是在Revision10的a.txt基礎(chǔ)上作的修改赃份。
這種情況叫做Conflict(沖突),
?a.txt文件的圖標會變成一個黃色三角。
這時抓韩,只能依靠李四自己去判斷到底第三行應該修改為“Typr”還是“Type”纠永。
當李四確定修改之后,在a.txt文件上單擊右鍵谒拴,TortoiseSVN->Resolved
告訴Subversion已經(jīng)解決了Conflict尝江。
這時再執(zhí)行Commit命令就能提交修改(生成Revision 12)。
Subversion這種控制方式保證了你對文件所作的修改都是基于文件的最新版本英上。
24炭序、“.svn”目錄
在客戶端Working Copy的每一層目錄中都會有一個“.svn”目錄,
該目錄是Subversion進行管理用的目錄苍日。
不要手動修改其中的文件惭聂。
該目錄存儲了Working Copy的一個副本
實際存儲副本的地方是F:\project1\.svn\text-base目錄
比如:F:\Project1是一個Working Copy,
該目錄下有兩個文件a.txt和b.txt還有一個子目錄ccc相恃,
子目錄ccc中還有一個d.txt文件辜纲。
?“.svn”目錄中存儲的是你最近一次執(zhí)行完Update或者Commit命令之后當前目錄中文件的副本,
比如:F:\project1\.svn\text-base中存儲的a.txt和b.txt
是最近一次執(zhí)行完Update或者Commit命令之后F:\project1下的a.txt和b.txt的拷貝拦耐。
也就是說你所作的修改都是基于“.svn”目錄存儲的那些文件耕腾。
這種機制可以讓我們在不連接網(wǎng)絡(luò)的情況下,
將Working Copy中的文件恢復到修改之前的狀態(tài)揩魂。
?Subversion的Revert命令就是利用了這種機制來實現(xiàn)的幽邓。
比如你修改了F:\project1\a.txt文件,
這時你又改變了主意想放棄對該文件的修改火脉,
你可以單擊右鍵牵舵,TortoiseSVN->Revert,
修改過的F:\project1\a.txt文件
就會被F:\project1\.svn\text-base中a.txt文件的副本所替代倦挂,
使得a.txt恢復到修改前的狀態(tài)畸颅。
?Working Copy中每一個子目錄下都會有一個“.svn”目錄,
并不是只有最上層目錄才有“.svn”目錄方援。
所以没炒,F(xiàn):\project1\ccc下也有一個“.svn”目錄,
該目錄存儲的是F:\project1\ccc\d.txt的副本
?(d.txt的副本位于F:\project1\ccc\.svn\text-base)犯戏。
也就是說每個“.svn”目錄只存儲同級目錄中的“文件”副本送火,
而不存儲“目錄”副本∠确耍“.svn”目錄存有許多重要的內(nèi)容种吸,
所以前面說在刪除文件或目錄時,
必須用TortoiseSVN->Delete呀非,
而不能用windows自帶的”刪除”或者“Delete”鍵來刪除文件或目錄坚俗,尤其是對于目錄的刪除镜盯。
25、混合版本
?Subversion的Working Copy被設(shè)計成一種能夠包含不同版本的文件共存的形式猖败。
比如F:\Project1是一個Working Copy速缆,
該目錄下有兩個文件a.txt和b.txt。
執(zhí)行Update命令恩闻,將Working Copy更新到最新版本(Revision 24)艺糜。
這時,a.txt和b.txt的Revision都是24
?(其實對于單個文件來說并不存在Revision判呕,
?Revision是對于整個Repository而言的倦踢,
這里所指的是Repository的Revision24所存儲的a.txt和b.txt送滞,
但為了方便而采用這種描述方式侠草,請注意,下同)犁嗅。
之后边涕,你的同事修改了a.txt,并且提交了修改褂微,
這時Repository的Revision就變成25了功蜓。
注意,這時你沒有再次執(zhí)行Update宠蚂,
因此你的Working Copy的Revision還是24式撼。
這時你修改了b.txt文件,并提交修改求厕。
因為Revision25并沒有對b.txt文件進行修改著隆,
因此你對b.txt文件的修改是基于b.txt文件最新的版本,
所以不會出現(xiàn)Conflict呀癣。
當你提交b.txt的修改后美浦,產(chǎn)生Revision26。
這時你會發(fā)現(xiàn)你的Working Copy中的a.txt文件并不是Revision25中的a.txt文件项栏,
它還是Revision24的a.txt文件浦辨,而你的b.txt文件是Revision26的b.txt文件。
也就是說當你Commit時沼沈,你的Working Copy中只有你提交的那些文件是最新版本流酬,
而其他沒有修改的文件并不會更新為最新版本。
這樣就造成了你的Working Copy由不同的Revision文件所組成
?(Revision24的a.txt文件和Revision26的b.txt文件)列另。
前面說過在提交修改前必須保證你是在文件的最新版本基礎(chǔ)上修改芽腾,
如果在這種混合版本的情況下,
怎樣才能知道當前Working Copy中的文件是否為最新版本访递?
在前面所說的“.svn”目錄中有一個文件名為“entries”的文件晦嵌,
該文件記錄了當前Working Copy中的每一個文件的Revision,
因此當你Commit時,Subversion會從該文件中取得你提交文件的Revision惭载,
再與Repository的最新Revision一比較就可以知道你修改的文件是否基于該文件的最新版本旱函。
26、文件的附加屬性
在Subversion中描滔,每個文件可以擁有一種叫做附加屬性的東西棒妨。
附加屬性描述了該文件所擁有的一些特性。
?Subversion已經(jīng)預定義了一些附加屬性
(這里只是指Subversion已經(jīng)定義了一些附加屬性的“名稱”含长,
并不是指已經(jīng)將這些屬性附加在文件上了券腔,
比如默認情況下文本文件一開始不含任何屬性,
直到人為的對該文件添加附加屬性)拘泞,
并且你可以對文件添加自定義的屬性纷纫。
?Subversion對待附加屬性就像對待文件內(nèi)容一樣,
當修改了一個文件的附加屬性(添加陪腌,改變辱魁,刪除附加屬性),
即使沒有對文件的內(nèi)容進行修改诗鸭,
同樣可以Commit該文件染簇,就像更改了文件內(nèi)容那樣岩榆,
?Repository也會生成新的Revision蚤氏,
所以從某種意義上來說,
?Subversion不區(qū)別對待文件的附加屬性的修改和文件的內(nèi)容的修改蔫骂,
文件的附加屬性可以看成是一種特殊的文件內(nèi)容蝌箍。
?Subversion預定義了若干個附加屬性青灼,
這里只討論“svn:needs-lock”屬性,
因為它與我們上面的文件鎖定會產(chǎn)生的一個問題有關(guān)十绑。
其他的屬性可以參考Subversion自帶的幫助文檔聚至。
考慮這種情況,
張三和李四同時想對一個圖片文件a.jpg作修改本橙,
張三在修改時先將該文件鎖定扳躬,然后進行修改,
同時李四也開始對該文件進行修改甚亭,
但李四忘記了對非文本文件進行修改時應該先鎖定該文件贷币。
張三首先對該文件修改完畢,于是張三向服務(wù)器提交了他的修改亏狰。
之后役纹,李四也完成了修改,當他提交修改時暇唾,
?Subversion提示李四的文件版本不是最新的促脉,
在Commit之前應先更新a.jpg到最新版本辰斋,
由于圖片文件無法合并,
這就意味著張三和李四之間必定有一個人的修改會作廢瘸味。
應用“svn:needs-lock”屬性可以避免這個問題宫仗。
當一個文件擁有“svn:needs-lock”屬性時,
該文件在沒有鎖定時旁仿,文件的圖標是灰色的藕夫,
表示該文件是一個只讀文件(該文件的Windows只讀屬性的復選框為選中),
這個灰色的圖標就會提醒想對該文件進行修改的人枯冈,
在修改該文件之前應該首先鎖定該文件毅贮。
鎖定該文件之后,文件的只讀屬性就會去掉了尘奏,
一旦釋放掉鎖滩褥,文件的圖標又會變成灰色,
文件也會變成只讀的了罪既。
李四在這種情況下就會避免在沒有鎖定文件時對文件進行修改铸题。
對非文本文件添加“svn:needs-lock”
屬性應該在將該文件第一次添加到Repository時就設(shè)置,
當然琢感,一個文件可以在任意時刻添加附加屬性,
這樣做是為了減少李四所遇到的那個問題發(fā)生的幾率探熔。
具體的方法是:
首先將a.jpg文件拷貝到Working Copy中驹针,
然后在該文件上單擊右鍵,
?TortoiseSVN->Add诀艰,告訴Subversion要將該文件納入版本控制柬甥,
接著在該文件上單擊右鍵并選中屬性,
在彈出的屬性對話框中選中Subversion頁其垄。
在下拉框中選中“svn:needs-lock”苛蒲,
并在下面的文本框中填入“*”
(其實這里填什么都無所謂,只要文件有“svn:needs-lock”附加屬性就行)绿满,
之后點Set按鈕臂外,“svn:needs-lock”附加屬性就設(shè)置好了。
然后執(zhí)行Commit命令提交修改喇颁。
這時當其他人執(zhí)行Update時漏健,
?a.jpg就會添加到他們的Working Copy中,
并且文件的附加屬性也會隨文件一起被得到橘霎。
可以看到a.jpg此時的圖標就是灰色的蔫浆,
文件的Windows屬性也是只讀的。
27姐叁、svnlook author
Dos 命令輸入:Svnlook author -r 538 E:\svn\svnproject會顯示出某個版本的作者: