svn merge的語法允許非常靈活的指定參數,如下是一些例子:
$ svn merge http://svn.example.com/repos/branch1@150 \ http://svn.example.com/repos/branch2@212 \ my-working-copy $ svn merge -r 100:200 http://svn.example.com/repos/trunk my-working-copy $ svn merge -r 100:200 http://svn.example.com/repos/trunk
第一種語法使用URL@REV的形式直接列出了所有參數,第二種語法可以用來作為比較同一個URL的不同版本的簡略寫法,最后一種語法表示工作拷貝是可選的,如果省略,默認是當前目錄。
但是要哪兩個樹進行比較呢?乍一看,回答很明確,只要比較最新的主干與分支。但是你要意識到—這個想法是錯誤的,傷害了許多新用戶!因為svn merge的操作很像svn diff,比較最新的主干和分支樹不僅僅會描述你在分支上所作的修改,這樣的比較會展示太多的不同,不僅包括分支上的增加,也包括了主干上的刪除操作,而這些刪除根本就沒有在分支上發生過。
)
另外通過同一分支上的版本間merge可以執行反向操作,比如版本5對于版本4的修改是完全錯誤的,那么可以通過 svn merge -r 5:4 file.cpp working-copy 來達到在working-copy 中取消這個修改.
反向操作另外一個作用,加入你刪除了head版本中的test.cpp , 但是又想找回來,那么你可以 svn log -v 察看test.cpp 是什么時候被刪除的., -r 10 , 上一個版本 8 . 那么可以執行如下
svn merger -r 10:8 file:///…/ working-copy 就還原了.
當然svn copy -r 也可以.
U foo
foo
更新了(從服務器收到修改)。
A foo
foo
被添加到工作拷貝。
D foo
foo
在工作拷貝被刪除了。
R foo
foo
在工作拷貝已經被替換了,這是說,foo
被刪除,而一個新的同樣名字的項目添加進來,它們具有同樣的名字,但是版本庫會把它們看作具備不同歷史的不同對象。
G foo
foo
接收到版本庫的更改,你的本地版本也已經修改,但改變沒有互相影響,Subversion成功的將版本庫和本地文件合并,沒有發生任何問題。
C foo
foo
的修改與服務器沖突,服務器的修改與你的修改交迭在一起,不要恐慌,這種沖突需要人(你)來解決,我們在后面的章節討論這種情況。
L some_dir # svn已經在.svn目錄鎖定了some_dir M bar.c # bar.c的內容已經在本地修改過了 M baz.c # baz.c屬性有修改,但沒有內容修改 X 3rd_party # 這個目錄是外部定義的一部分 ? foo.o # svn并沒有管理foo.o ! some_dir # svn管理這個,但它可能丟失或者不完 ~ qux # 作為file/dir/link進行了版本控制,但類型已經改變 I .screenrc # svn不管理這個,配置確定要忽略它 A + moved_dir # 包含歷史的添加,歷史記錄了它的來歷 M + moved_dir/README # 包含歷史的添加,并有了本地修改 D stuff/fish.c # 這個文件預定要刪除 A stuff/loot/bloo.h # 這個文件預定要添加 C stuff/loot/lump.c # 這個文件在更新時發生沖突 C stuff/loot/glub.c # 文件在更新時發生屬性沖突 R xyz.c # 這個文件預定要被替換 S stuff/squawk # 這個文件已經跳轉到了分支 K dog.jpg # 文件在本地鎖定;有鎖定令牌 O cat.jpg # 文件在版本庫被其他用戶鎖定 B bird.jpg # 文件本地鎖定,但鎖定發生錯誤 T fish.jpg # 文件本地鎖定,但鎖定丟失 第一列
A item
item
預定加入到版本庫。
C item
item
發生沖突,在從服務器更新時與本地版本發生交迭,在你提交到版本庫前,必須手工的解決沖突。
D item
item
預定從版本庫中刪除。
M item
item
的內容被修改了。
R item
item
預定將要替換版本庫中的item
,這意味著這個對象首先要被刪除,另外一個同名的對象將要被添加,所有的操作發生在一個修訂版本。
X item
? item
item
不在版本控制之下,你可以通過使用svn status的--quiet
(-q
)參數或父目錄的svn:ignore
屬性忽略這個問題,關于忽略文件的使用,見“svn:ignore
”一節。
! item
item
在版本控制之下,但是已經丟失或者不完整,這可能因為使用非Subversion命令刪除造成的,如果是一個目錄,有可能是檢出或是更新時的中斷造成的,使用svn update可以重新從版本庫獲得文件或者目錄,也可以使用svn revert file恢復原來的文件。
~ item
item
在版本庫已經存在,但你的工作拷貝中的是另一個。舉一個例子,你刪除了一個版本庫的文件,新建了一個在原來的位置,而且整個過程中沒有使用svn delete或是svn add。
I item
item
不在版本控制下,Subversion已經配置好了會在svn add、svn import和svn status命令忽略這個文件,關于忽略文件,見“svn:ignore
”一節。注意,這個符號只會在使用svn status的參數--no-ignore
時才會出現—否則這個文件會被忽略且不會顯示!
第二列說明文件或目錄的屬性的狀態(更多細節可以看“屬性”一節),如果一個M
出現在第二列,說明屬性被修改了,否則顯示空白。
第三列只顯示空白或者L
,L
表示Subversion已經鎖定了這個目錄的工作區域.svn
,當你的svn commit正在運行的時候—也許正在輸入log信息,運行svn status你可以看到L
標記,如果這時候Subversion并沒有運行,可以推測Subversion發生中斷并且已經鎖定,你必須運行svn cleanup來清除鎖定(本節后面將有更多論述)。
+
,+
的意思是一個有附加歷史信息的文件或目錄預定添加或者修改到版本庫,通常出現在svn move或是svn copy時,如果是看到A +
就是說要包含歷史的增加,它可以是一個文件或是拷貝的根目錄。+
表示它是即將包含歷史增加到版本庫的目錄的一部分,也就是說他的父目錄要拷貝,它只是跟著一起的。 M +
表示將要包含歷史的增加,并且已經更改了。當你提交時,首先會隨父目錄進行包含歷史的增加,然后本地的修改提交到更改后的版本S
,表示這個目錄或文件已經轉到了一個分支下了(使用svn switch)。svn status也有一個–verbose
(-v
)選項,它可以顯示工作拷貝中的所有項目,即使沒有改變過:
$ svn status --verbose M 44 23 sally README 44 30 sally INSTALL M 44 20 harry bar.c 44 18 ira stuff 44 35 harry stuff/trout.c D 44 19 ira stuff/fish.c 44 21 sally stuff/things A 0 ? ? stuff/things/bloo.h 44 36 harry stuff/things/gloo.c
第一列保持相同,第二列顯示一個工作版本號,第三和第四列顯示最后一次修改的版本號和修改人。
上面所有的svn status調用并沒有聯系版本庫,只是與.svn
中的元數據進行比較的結果,最后,是–show-updates
(-u
)參數,它將會聯系版本庫為已經過時的數據添加新信息:
$ svn status --show-updates --verbose M * 44 23 sally README M 44 20 harry bar.c * 44 35 harry stuff/trout.c D 44 19 ira stuff/fish.c A 0 ? ? stuff/things/bloo.h Status against revision: 46
注意這兩個星號:如果你現在執行svn update,你的README
和trout.c
會被更新,這告訴你許多有用的信息—你可以在提交之前,需要使用更新操作得到文件README
的更新,或者說文件已經過時,版本庫會拒絕了你的提交。
輸出的格式為統一區別格式(unified diff format),刪除的行前面加一個-
,添加的行前面有一個+
,svn diff命令也打印文件名和打補丁需要的信息,所以你可以通過重定向一個區別文件來生成“補丁”:
$ svn diff > patchfile
舉個例子,你可以把補丁文件發送郵件到其他開發者,在提交之前審核和測試。
svn cat
如果你只是希望檢查一個過去的版本而不希望察看它們的區別,使用svn cat:
$ svn cat --revision 2 rules.txt Be kind to others Freedom = Chocolate Ice Cream Everything in moderation Chew with your mouth open $
你可以重定向輸出到一個文件:
$ svn cat --revision 2 rules.txt > rules.txt.v2
除了以上的命令,你可以使用帶參數--revision
的svn update和svn checkout來使整個工作拷貝“回到過去”[7]:$ svn checkout --revision 1729 # Checks out a new working copy at r1729 … $ svn update --revision 1729 # Updates an existing working copy to r1729 …# 建立庫$ svnadmin create /usr/local/svn/newrepos# 建立分支建立一個備份只是傳遞兩個目錄參數到svn copy命令:$ cd bigwc $ svn copy trunk branches/my-calc-branch $ svn status A + branches/my-calc-branch
現在,我們必須告訴你建立分支最簡單的方法:svn copy可以直接對兩個URL操作。
$ svn copy http://svn.example.com/repos/calc/trunk \ http://svn.example.com/repos/calc/branches/my-calc-branch \ -m "Creating a private branch of /calc/trunk." Committed revision 341.
原文:http://www.alisdn.com/wordpress/?p=1381