SVN筆記

SVN使用

      之前學習了一些git命令,這次學svn命令,多少因此有些幫助也有些困惑。
      首先,得明白git和svn的形態有些區別。git是“等大小”,svn是“不等大小”,即git各個工作區都可以當做倉庫,svn只能由一臺服務器來做倉庫。
      其次就是命令不同了,簡單地記一些。

svn常用命令

  1. svnadmin create /home/vanyo/repos 創建一個repos倉庫(原先不存在這個目錄);
  2. svn import /tmp file:///home/vanyo/repos/test -m "Initial import" 將本地的目錄加入到版本庫(這時,版本庫中是不會複製該目錄的,只是存在了自己的數據庫中);
  3. svn checkout file:///home/vanyo/repos/test/xxx ./myproject 將版本庫中的test/xxx checkout下來(其實就是git中的pull),這個時候,當前目錄就會出現myproject這個倉庫,svn checkout -r {"2006-02-17 15:30"} checkout也可以用時間來選擇版本號(有多種格式支持,注意有空格的需要用雙引號包裹起來);
  4. 之後就可以在這個屬於自己的倉庫中修改內容,比如在目錄下創建了README.md這個文件,或者對README.md進行了修改;
  5. svn add README.md 將修改後的README.md加入到自己的倉庫中(特別是操作系統的命令,如touch一個文件之後);
  6. svn commit -m "update" 將修改的內容提交到服務器上;
  7. svn update 會更新當下工作區域的內容,和服務器上的同步;
  8. 同時,要記住svn刪除和移動文件之類的都有自己的命令,不要直接用本地的unix命令刪除。特別的,svn mv a\ b\ 的時候會發現a目錄還存在,但是內容都被移到新出現的b目錄中,這個時候不需要去動a目錄,直接commit,會發現a目錄最後被刪除;
  9. svn list svn://127.0.0.1/ 列出版本庫中的所有目錄;
  10. svn revert README.md 可以用來回滾READMME.md文件,使其回到未修改的狀態(任何預定狀態,包括刪除、增加、修改等);
  11. svn diff 可以有很多比較方式,利用各種參數,可以比較“本地修改”,“工作拷貝與版本庫”,“版本庫與版本庫”;
  12. svn cleanup 它查找工作拷貝中的所有遺留的日誌文件,刪除進程中工作拷貝 的鎖;

svn衝突處理

      其實這玩意兒不好說,我就自己記一筆看看,日後看到其他的就繼續補充。

情境

      一個版本庫有A、B兩個工作拷貝,A中修改了README內容爲“This is a change from A.”。B修改README內容爲“This is a change from B.”。之後,A提交了,沒事。B再提交時,出事兒了:

Sending        READM  
Transmitting file data .svn: E160028: Commit failed (details follow):
svn: E160028: File '/aliworkspace/READM' is out of date

      喲,衝突發生了,說是過時,這時候,B update一下:

Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

      其實我這裏這些選項我決定還是不翻譯什麼的了,未來的自己,你忘了就自己查一遍吧。

      這裏還有一個很重要的命令:

svn resolve README --accept "working"

      讓版本庫接受working。

      最後,告訴版本庫已經接受修改,此文件無衝突:

svn reloved README

回到過去

      可以利用svn checkout -r 版本號 或者 svn update -r 版本號來完成

SVN屬性

規則

  1. 我們可以認爲它們是一個兩 列的表,附加到你的工作拷貝的每個條目上,映射屬性名到任意的值;
  2. 限制就是名稱必須是可讀的文本;
  3. 屬性分爲版本化和非版本化,對於文件和目錄的屬性是版本化的;版本庫的屬性是對應於某個修訂號的,是非版本化的;
  4. 不要使用svn:爲前綴的屬性名;
  5. 對於屬性名稱也有一些限制,屬性名必須以一個字符、一個冒號(:)或下劃線(_)開始,之後 你可以使用數字,橫線(-)和句號(.);

相關命令

  1. svn propset name 'this is a read file' ./README.md 可以爲README.md文件設置一個key=name,value=this is a read file的屬性值,添加–revprop選項來設定修訂版本的屬性;
  2. svn proplist 路徑 列出該路徑下的所有屬性key;
  3. svn propget name README.md 獲取README.md文件的屬性name對應的值;
  4. svn propdel name README.md 刪除README.md文件的屬性nanme對應的值;

svn鎖機制

  1. svn lock README -m "Ali test server is editing the file. 在沒有鎖的情況下鎖住了README這個文件,其他人還是可以update這個時候的版本庫,但是不能在修改README後commit。所以,保險起見,還是update之後緊跟着status纔好(–show-updates);
  2. svn status README 此時查看文件狀態,會看到K標誌,表示本人擁有這把鎖;
  3. 在修改後commit,會自動解除鎖(此時會釋放該目錄下的所有鎖,可以用no-lock = yes選項防止);
  4. svn unlock README 手動解除文件鎖;
  5. svn info README 查看文件的詳細信息,可以看到是否被鎖,持有鎖的人時誰;

      然而,這把鎖實在是太逗了,可以被管理員打破不說,其他用戶還可以用unlock –force強制打破或者偷竊。

svn:needs-lock 這個屬性規定“只有擁有鎖的用戶才能寫文件,否則都是隻讀形式”。這就避免了浪費。

分支的操作

      通常,將在版本庫中的某個app路徑下會創建trunk、branches和tags。正如它們的意思一樣,我們將會在trunk中進行主版本地跟進,在branches中分別做一些事情,最後合併到trunk中。

分支創建

      直接對版本庫進行操作:

svn cp svn://IP/app/trunk svn://IP/app/branches -m "Create a branches."

      同意,可以在本地cp,然後mv,最後update,雖然版本庫會識別出是備份文件,從而不經過網絡傳輸,但是還是前者方便。

分支的合併

svn merge -c 146 svn://10.125.6.129/aliworkspace/calc/trunk /calc/branches/trunk/
或者
svn merge -r 143:146 svn://10.125.6.129/aliworkspace/calc/trunk 

      手冊裏有3、4種方式,可以瞭解下。同意,分支的合併會產生衝突,然後就是人工修改一下上傳了吧。
      –dry-run選項可以嘗試merge,輸出衝突,但不會真的合併。

回滾操作

      如果想要取消之前的合併,則可以用-c -146,或者-r HEAD:143

標籤

      沒想到標籤就是一個工作拷貝……原來概念這麼簡單啊。但是要注意的是,在規範的tags文件下的工作拷貝,可以分爲多份,比如release1.0,release1.2什麼的。每一個拷貝中的文件也不一定都是一個修訂版的,可以是不同時期的穩定文件。當然,這點就按時期情況來看了。

關於TortoiseSVN的使用

      一個可視化的Subversion版本控制程序,注意svnserver(或者其他)服務器的conf文件內部權限的設定即可,其他操作參照svn。

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