SVN簡易使用手冊新手上路
本節講解一下SVN簡易使用手冊中使用svn獲取開源項目源代碼的內容,之前一節我們沒有講解完畢,在這里做一下補充,希望通過本節大家能夠學到更多知識。
修改你的工作拷貝
SVN簡易使用手冊介紹修改你的工作拷貝?,F在你可以開始工作并且修改你的工作拷貝了,你很容易決定作出一個修改(或者是一組),像寫一個新的特性,修正一個錯誤等等。這時可以使用的Subversion命令包括svnadd、svndelete、svncopy和svnmove。如果你只是修改版本庫中已經存在的文件,在你提交之前,不必使用上面的任何一個命令。你可以對工作備份作的修改包括:
文件修改
這是最簡單的一種修改,你不必告訴Subversion你想修改哪一個文件,只需要去修改,然后Subversion會自動地探測到哪些文件已經更改了。
目錄樹修改
你可以“標記”目錄或者文件為預定要刪除、增加、復制或者移動,也許這些改動在你的工作拷貝馬上發生,而版本庫只在你提交的時候才發生改變。
修改文件,可以使用文本編輯器、字處理軟件、圖形程序或任何你常用的工具,Subverion處理二進制文件像同文本文件一樣—效率也一樣。
這些是常用的可以修改目錄樹結構的子命令(我們會在后面包括svnimport和svnmkdir)。
警告
SVN簡易使用手冊中遇到的問題警告。你可以使用任何你喜歡的工具編輯文件,但你不可以在修改目錄結構時不通知Subversion,需要使用svncopy、svndelete和svnmove命令修改工作拷貝的結構,使用svnadd增加版本控制的新文件或目錄。
svnaddfoo預定將文件、目錄或者符號鏈foo添加到版本庫,當你下次提交后,foo會成為其父目錄的一個子對象。注意,如果foo是目錄,所有foo中的內容也會預定添加進去,如果你只想添加foo本身,使用--non-recursive(-N)參數。
svndeletefoo預定將文件、目錄或者符號鏈foo從版本庫中刪除掉,如果foo是文件,它馬上從工作拷貝中刪除,如果是目錄,不會被刪除,但是Subversion準備好刪除了,當你提交你的修改,foo就會在你的工作拷貝和版本庫中被刪除。[2]
svncopyfoobar建立一個新的項目bar作為foo的復制品,當在下次提交時會將bar添加到版本庫,這種拷貝歷史會記錄下來(按照來自foo的方式記錄),svncopy并不建立中介目錄。
svnmovefoobar這個命令與與運行svncopyfoobar;svndeletefoo完全相同,bar作為foo的拷貝準備添加,foo已經預定要被刪除,svnmove不建立中介的目錄。
不通過工作拷貝修改版本庫
SVN簡易使用手冊介紹不通過工作拷貝修改版本庫。本章的前面曾經說過,為了使版本庫反映你的改動,你應該提交所有改動。這并不完全正確—有一些方式是可以直接操作版本庫的,當然只有子命令直接操作URL而不是本地拷貝路徑時才可以實現,通常svnmkdir、svncopy、svnmove、和svndelete可以使用URL工作。
指定URL的操作方式有一些區別,因為在使用工作拷貝的運作方式時,工作拷貝成為一個“集結地”,可以在提交之前整理組織所要做的修改,直接對URL操作就沒有這種奢侈,所以當你直接操作URL的時候,所有以上的動作代表一個立即的提交。
檢查你的修改
當你完成修改,你需要提交他們到版本庫,但是在此之前,檢查一下做過什么修改是個好主意,通過提交前的檢查,你可以整理一份精確的日志信息,你也可以發現你不小心修改的文件,給了你一次恢復修改的機會。此外,這是一個審查和仔細察看修改的好機會,你可通過命令svnstatus、svndiff和svnrevert精確地察看所做的修改。你可以使用前兩個命令察看工作拷貝中的修改,使用第三個來撤銷部分(或全部)的修改。
Subversion已經被優化來幫助你完成這個任務,可以在不與版本庫通訊的情況下做許多事情,詳細來說,對于每一個文件,你的的工作拷貝在.svn包含了一個“原始的”拷貝,所以Subversion可以快速的告訴你那些文件修改了,甚至允許你在不與版本庫通訊的情況下恢復修改。
svnstatus相對于其他命令,你會更多地使用這個svnstatus命令。
CVS用戶:控制另類的更新!你也許使用cvsupdate來看你做了哪些修改,svnstatus會給你所有你做的改變—而不需要訪問版本庫,并且不會在不知情的情況下與其他用戶作的更改比較。
在Subversion,update只是做這件事—將工作拷貝更新到版本庫的***版本,你可以消除使用update察看本地修改的習慣。
SVN簡易使用手冊中如果你在工作拷貝的***目錄運行不帶參數的svnstatus命令,它會檢測你做的所有的文件或目錄的修改,以下的例子是來展示svnstatus可能返回的狀態碼(注意,#之后的不是svnstatus打印的)。Labc.c#svn已經在.svn目錄鎖定了abc.cMbar.c#bar.c的內容已經在本地修改過了Mbaz.c#baz.c屬性有修改,但沒有內容修改X3rd_party#這個目錄是外部定義的一部分?foo.o#svn并沒有管理foo.o!some_dir#svn管理這個,但它可能丟失或者不完整~qux#作為file/dir/link進行了版本控制,但類型已經改變I.screenrc#svn不管理這個,配置確定要忽略它A+moved_dir#包含歷史的添加,歷史記錄了它的來歷M+moved_dir/README#包含歷史的添加,并有了本地修改Dstuff/fish.c#這個文件預定要刪除Astuff/loot/bloo.h#這個文件預定要添加Cstuff/loot/lump.c#這個文件在更新時發生沖突Rxyz.c#這個文件預定要被替換Sstuff/squawk#這個文件已經跳轉到了分支在這種格式下,svnstatus打印五列字符,緊跟一些空格,接著是文件或者目錄名。***列告訴一個文件的狀態或它的內容,返回代碼解釋如下:
Aitem文件、目錄或是符號鏈item預定加入到版本庫。
Citem文件item發生沖突,在從服務器更新時與本地版本發生交迭,在你提交到版本庫前,必須手工的解決沖突。
Ditem文件、目錄或是符號鏈item預定從版本庫中刪除。
Mitem文件item的內容被修改了。
Ritem文件、目錄或是符號鏈item預定將要替換版本庫中的item,這意味著這個對象首先要被刪除,另外一個同名的對象將要被添加,所有的操作發生在一個修訂版本。
Xitem目錄沒有版本化,但是與Subversion的外部定義關聯,關于外部定義,可以看“外部定義”一節。
?item文件、目錄或是符號鏈item不在版本控制之下,你可以通過使用svnstatus的--quiet(-q)參數或父目錄的svn:ignore屬性忽略這個問題,關于忽略文件的使用,見“svn:ignore”一節。!item文件、目錄或是符號鏈item在版本控制之下,但是已經丟失或者不完整,這可能因為使用非Subversion命令刪除造成的,如果是一個目錄,有可能是檢出或是更新時的中斷造成的,使用svnupdate可以重新從版本庫獲得文件或者目錄,也可以使用svnrevertfile恢復原來的文件。
~item文件、目錄或是符號鏈item在版本庫已經存在,但你的工作拷貝中的是另一個。舉一個例子,你刪除了一個版本庫的文件,新建了一個在原來的位置,而且整個過程中沒有使用svndelete或是svnadd。
Iitem文件、目錄或是符號鏈item不在版本控制下,Subversion已經配置好了會在svnadd、svnimport和svnstatus命令忽略這個文件,關于忽略文件,見“svn:ignore”一節。注意,這個符號只會在使用svnstatus的參數--no-ignore時才會出現—否則這個文件會被忽略且不會顯示!
第二列說明文件或目錄的屬性的狀態(更多細節可以看“屬性”一節),如果一個M出現在第二列,說明屬性被修改了,否則顯示空白。
第三列只顯示空白或者L,L表示Subversion已經在.svn工作區域鎖定了這個項目,當你的svncommit正在運行的時候—也許正在輸入log信息,運行svnstatus你可以看到L標記,如果這時候Subversion并沒有運行,可以推測Subversion發生中斷并且已經鎖定,你必須運行svncleanup來清除鎖定(本節后面將有更多論述)。
第四列只會顯示空白或+,+的意思是一個有附加歷史信息的文件或目錄預定添加或者修改到版本庫,通常出現在svnmove或是svncopy時,如果是看到A+就是說要包含歷史的增加,它可以是一個文件或是拷貝的根目錄。+表示它是即將包含歷史增加到版本庫的目錄的一部分,也就是說他的父目錄要拷貝,它只是跟著一起的。M+表示將要包含歷史的增加,并且已經更改了。當你提交時,首先會隨父目錄進行包含歷史的增加,然后本地的修改提交到更改后的版本。
第五列只顯示空白或是S,表示這個目錄或文件已經轉到了一個分支下了(使用svnswitch)。如果你傳遞一個路徑給svnstatus,它只給你這個項目的信息:$svnstatusstuff/fish.cDstuff/fish.c
svnstatus也有一個--verbose(-v)選項,它可以顯示工作拷貝中的所有項目,即使沒有改變過:
- $svnstatus--verboseM4423sallyREADME4430
- sallyINSTALLM4420harrybar.c4418ira
- stuff4435harrystuff/trout.cD4419ira
- stuff/fish.c4421sallystuff/thingsA0??
- stuff/things/bloo.h4436harrystuff/things/gloo.c
這是svnstatus的“加長形式”,***列保持相同,第二列顯示一個工作版本號,第三和第四列顯示***一次修改的版本號和修改人。上面所有的svnstatus調用并沒有聯系版本庫,只是與.svn中的元數據進行比較的結果,***,是--show-updates(-u)參數,它將會聯系版本庫為已經過時的數據添加新信息:
- $svnstatus--show-updates--verboseM*4423sallyREADMEM44
- 20harrybar.c*4435harrystuff/trout.cD44
- 19irastuff/fish.cA0??stuff/things/bloo.hStatus
- againstrevision:46
注意這兩個星號:如果你現在執行svnupdate,你的README和trout.c會被更新,這告訴你許多有用的信息—你可以在提交之前,需要使用更新操作得到文件README的更新,或者說文件已經過時,版本庫會拒絕了你的提交。(后面還有更多關于此主題)。本節講解SVN簡易使用手冊完畢。
【編輯推薦】