SVN操作收藏

SVN是什麼
Svn是一個離線的代碼管理,可以多個人一起修改,然後再將修改的內容提交到Svn中。
每一個svn服務器中的數據存儲單位叫做存儲,但是你不僅僅可以把整個存儲當作你維護的內容,也可以將其中的某個分支目錄像根存儲一樣的使用。
Svn是嚴格區分大小寫的,存儲中路徑的名字只有大小寫不同,也會當作不同的路徑處理。注意這裏會在windows平臺下導致一些非常嚴重的問題。在windows下如果svn服務器上同一文件夾有兩個只有大小寫不同的文件時會出現則會出現總是提示某個文件丟失,而更新到哪個文件也是未知的。如果同一文件夾有隻有大小寫不同的文件夾會導致總是無法將一個文件夾同步下來。最嚴重的要數如果存儲名稱錯誤,則你沒有辦法提交數據,因爲帳戶認證是基於存儲的。

SVN的版本概念
先說明一下幾個版本概念。
一個是服務器版本,每一次提交svn都會將版本號加1,無論你是修改了文件,還是添加刪除了,甚至修改一下文件夾的svn屬性,只要你提交都會更新版本;
第二個是本地基礎版本,也就是你上次進行update之後的和svn服務器上的版本,比如你update時服務器上是reverion11你的本地基礎版本就是reverion11,無論別人改了什麼,服務器上更新了多少版,只要你不執行update則你的基礎版本永遠是reverion11;
第三個是工作版本,就是你當前改着的版本,工作版本是基於基礎版本的,如果沒改,工作版本就和基礎版本一致,如果你改了,你的工作版本就是從基礎版本修改過來的。

SVN的操作
總是有人問已經在本地刪除了某個文件,可是一更新又從svn還原出來了,或者我已經把一個文件移動到另外的地方,可是怎麼修改svn讓他同步等等。在受svn管理的文件中,所有的文件操作不能想當然的進行,添加刪除和移動改名都是有對應的svn操作的,這樣才能自動的反映到svn上來,尤其是移動文件這樣的操作,如果操作不慎,就會無法將文件的修改歷史聯繫起來。不過,svn的操作有一些是需要連接服務器的“連線操作”有一些是之進行本地操作的“離線操作”。所以下面介紹一些svn使用的基本操作。

SVN基本操作之svn checkout
作爲svn的用戶,拿到一個svn地址,我們首先做的一個事情就是svn checkout,將svn上的關聯到本地的一個文件夾中。這個文件夾最好是空的文件夾,或者確保沒有和svn上相同名稱的路徑,當然這也說明這個操作是個連線操作。我們一般在執行checkout的時候只要給出svn的URL和本地的路徑兩個內容就可以了。這樣svn上最新的數據會被傳送到這個文件夾,目錄結構會自動建好,svn上的文件會自動出現在對應的文件夾中。當然如果你願意也可以選擇一箇舊的版本,或者只包含一層目錄或者只是這個文件夾中的文件。或許你發現了,每一個文件夾中比服務器上的內容多了個.svn文件夾,這個文件夾中存放着文件夾的屬性,這個文件夾中的每個文件的屬性、版本還有對應版本的一個副本。

SVN基本操作之svn update
這個操作就是將本地的的數據更新到svn上的某個版本,默認的操作是更新到最新版本,這個操作也是個連線操作。在這個過程中如果有人刪除了文件,它會你機器上的文件刪除,如果別人改了某個文件,會將這個文件更新。如果你修改了某個文件,別人刪除了它,則這個文件不會被刪除,只會和svn沒關係了。如果你修改了某個文件,而這個文件別人也修改了,在更新的過程中就會試圖自動將你的修改合併,如果成功,他的內容就是你修改的和別人修改的內容的並集,如果失敗,svn就會將這個文件標記爲衝突。衝突的問題我們放在下個說。

SVN基本操作之svn resolve
使用svn意味着你已經走在了工作在編輯和合並的道路上,那麼衝突的時候svn做了什麼,出現了衝突怎麼解決?
在標記爲衝突的過程中,如果是文本文件,如cpp和h文件,svn會修改它讓他不能進行編譯,併產生一個theirs和mime,分別包含svn服務器上的和我自己原來的版本。
如果是二進制文件,svn不會修改它,而會在目錄中產生一個r??和r??這兩個r??一個是你update之前的svn基礎版本,就是你上次執行update的版本,一個是svn上的當前update下來的版本。
你可以選擇直接使用theirs或者使用mime或者退回到上一個update版本,或者將兩個文件放在一起手工合併作爲解決的方法。
這個操作是離線操作。

SVN基本操作之svn commit
svn的commit操作就是將修改從工作拷貝發送到版本庫並將版本標記爲新的版本,這個過程中如果有人已經對這個版本進行了操作,也就是你的本地基礎版本和服務器不同,將會強制你執行一個update操作,這個操作是個連線操作。commit的過程僅僅是將你本地的一些修改提交到svn中讓svn上的和你的一致,在提交之前必須已經解決了需要提交文件已有的衝突才行。

SVN基本操作之svn add
如果一個文件不受svn管理,你需要把它添加到svn中,這個操作是個離線操作,僅僅是把這個文件標記爲需要添加,真正的添加到svn存儲的操作將在下一次commit時執行。這個過程中需要注意不要把一些不必要的文件比如編譯的臨時文件添加到svn。

SVN基本操作之svn import
當然你可以將一些文件直接添加到svn而不想修改這些文件的svn管理狀態,可以選擇將它們導入到svn。注意如果將一個文件導入,則給出的url就是它添加到svn的最終文件名,如果將一個文件夾導入,則會將根據目錄樹所有的子文件和文件夾放到對應的url的對應目錄樹中,根文件夾不會被添加。
這個操作是連線操作。

SVN基本操作之svn cleanup
這個操作清理整個所選擇的文件夾及其子文件夾,但是它不是清理垃圾文件什麼的,這肯定不是svn的工作。它也不會把衝突自動解決,如果能自動解決,在更新的時候爲什麼不做。如果你在某個svn操作時強制中斷了,比如svn的操作程序停止相應或者以外終止,就有可能導致文件夾處於鎖定狀態,這時需要清理。如果你的文件夾中的很多文件時間戳發生了變化,也最好執行以下cleanup這樣可以加速svn操作的執行。
這個操作是離線操作。

SVN基本操作之svn delete
既然有方法添加文件,就一定有方法刪除,雖然你看到的效果是文件直接被刪除了,但是實際上和添加一樣,這個操作是個離線操作,操作的結果將被標記,下次commit時服務器上的文件纔會被刪除。

SVN基本操作之svn revert
如果你的修改出現了問題,或者添加或者刪除了錯誤的文件,等等想還原操作,在commit之前可以執行revert操作,退回某步操作,這樣這些修改都會被還原到基礎版本狀態。這個操作不會和svn服務器有關係,不會連接服務器也不會更新文件,只是簡簡單單的回覆到基礎版本。
這個操作是個離線操作。

SVN基本操作之svn diff
這個操作就是比較你的工作版本和某個svn版本的區別,當然默認是你的基礎版本,因爲你的工作版本就是從基礎版本修改過來的麼。
在和基礎版本比較時是個離線操作,和歷史版本比較時是連線操作。

SVN基本操作之svn export
這個操作可以將一個已經在svn管理下的文件夾中的所有工作版本導出到一個文件夾中,或者直接從svn服務器上將一個版本導出到一個文件夾中。導出的文件夾不再在svn的管理控制下,也不會有.svn目錄,當然也不會包含不在svn管理下的文件。
在導出工作版本時是個離線操作,從svn直接導出時是連線操作。

SVN基本操作之svn copy
操作的名字顯而易見,就是複製操作,在svn上覆制文件有什麼好處呢,爲什麼不直接複製文件再添加到svn呢。這個問題我也考慮過,svn copy可以將文件在複製之前的歷史保留下來,這應該是最大的好處了。
這個操作是離線操作,需要提交才起效。

SVN基本操作之svn move
和copy一樣,歷史的留存也是和複製後刪除源文件這個方式最大的區別,並且它也是離線操作,需要提交才起效。

SVN基本操作之svn lock
如果你想獨佔修改這個文件,可以把文件鎖定,這樣就可以鎖定這個文件,這樣別人必須等待你提交了修改或者釋放了鎖才能提交他們的修改。這個操作不會對別人的svn本地存儲有什麼影響,而只是無法進行數據提交。如果某個文件有svn:needs-lock這樣的標誌時,文件會被設置爲只讀,提示你需要獲得鎖來修改。當然你也可以把文件的屬性修改直接修改,這個只是防君子不防小人的。
這個操作時連線操作。

SVN基本操作之svn unlock
雖然是unlock但是實際上這個我們平常不會將他用來和lock配對,因爲commit操作時,svn默認自動將鎖釋放了。這個操作的用處是在你得到鎖了之後,又不想鎖定這個文件時執行的。還有就是如果別人鎖定了這個文件,想強制把這個文件解鎖,就可以強制將這個文件解鎖。
這個操作時連線操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章