SVN使用
之前學習了一些git命令,這次學svn命令,多少因此有些幫助也有些困惑。
首先,得明白git和svn的形態有些區別。git是“等大小”,svn是“不等大小”,即git各個工作區都可以當做倉庫,svn只能由一臺服務器來做倉庫。
其次就是命令不同了,簡單地記一些。
svn常用命令
svnadmin create /home/vanyo/repos
創建一個repos倉庫(原先不存在這個目錄);svn import /tmp file:///home/vanyo/repos/test -m "Initial import"
將本地的目錄加入到版本庫(這時,版本庫中是不會複製該目錄的,只是存在了自己的數據庫中);svn checkout file:///home/vanyo/repos/test/xxx ./myproject
將版本庫中的test/xxx checkout下來(其實就是git中的pull),這個時候,當前目錄就會出現myproject這個倉庫,svn checkout -r {"2006-02-17 15:30"}
checkout也可以用時間來選擇版本號(有多種格式支持,注意有空格的需要用雙引號包裹起來);- 之後就可以在這個屬於自己的倉庫中修改內容,比如在目錄下創建了README.md這個文件,或者對README.md進行了修改;
svn add README.md
將修改後的README.md加入到自己的倉庫中(特別是操作系統的命令,如touch一個文件之後);svn commit -m "update"
將修改的內容提交到服務器上;svn update
會更新當下工作區域的內容,和服務器上的同步;- 同時,要記住svn刪除和移動文件之類的都有自己的命令,不要直接用本地的unix命令刪除。特別的,
svn mv a\ b\
的時候會發現a目錄還存在,但是內容都被移到新出現的b目錄中,這個時候不需要去動a目錄,直接commit,會發現a目錄最後被刪除; svn list svn://127.0.0.1/
列出版本庫中的所有目錄;svn revert README.md
可以用來回滾READMME.md文件,使其回到未修改的狀態(任何預定狀態,包括刪除、增加、修改等);svn diff
可以有很多比較方式,利用各種參數,可以比較“本地修改”,“工作拷貝與版本庫”,“版本庫與版本庫”;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屬性
規則
- 我們可以認爲它們是一個兩 列的表,附加到你的工作拷貝的每個條目上,映射屬性名到任意的值;
- 限制就是名稱必須是可讀的文本;
- 屬性分爲版本化和非版本化,對於文件和目錄的屬性是版本化的;版本庫的屬性是對應於某個修訂號的,是非版本化的;
- 不要使用svn:爲前綴的屬性名;
- 對於屬性名稱也有一些限制,屬性名必須以一個字符、一個冒號(:)或下劃線(_)開始,之後 你可以使用數字,橫線(-)和句號(.);
相關命令
svn propset name 'this is a read file' ./README.md
可以爲README.md文件設置一個key=name,value=this is a read file的屬性值,添加–revprop選項來設定修訂版本的屬性;svn proplist 路徑
列出該路徑下的所有屬性key;svn propget name README.md
獲取README.md文件的屬性name對應的值;svn propdel name README.md
刪除README.md文件的屬性nanme對應的值;
svn鎖機制
svn lock README -m "Ali test server is editing the file.
在沒有鎖的情況下鎖住了README這個文件,其他人還是可以update這個時候的版本庫,但是不能在修改README後commit。所以,保險起見,還是update之後緊跟着status纔好(–show-updates);svn status README
此時查看文件狀態,會看到K標誌,表示本人擁有這把鎖;- 在修改後commit,會自動解除鎖(此時會釋放該目錄下的所有鎖,可以用no-lock = yes選項防止);
svn unlock README
手動解除文件鎖;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。