一,svn的介紹php
Subversion(SVN) 是一個開源的版本控制系統, 也就是說 Subversion 管理着隨時間改變的數據。 這些數據放置在一箇中央資料檔案庫(repository) 中。 這個檔案庫很像一個普通的文件服務器, 不過它會記住每一次文件的變更。 這樣你就能夠把檔案恢復到舊的版本, 或是瀏覽文件的變更歷史。html
二,svn的概念程序員
平常開發過程其實就是這樣的(假設你已經Checkout而且已經工做了幾天):Update(得到最新的代碼) -->做出本身的修改並調試成功 --> Commit(你們就能夠看到你的修改了) 。算法
若是兩個程序員同時修改了同一個文件呢, SVN能夠合併這兩個程序員的改動,實際上SVN管理源代碼是以行爲單位的,就是說兩個程序員只要不是修改了同一行程序,SVN都會自動合併兩種修改。若是是同一行,SVN會提示文件Confict, 衝突,須要手動確認。數據庫
三,svn的主要功能服務器
CVS 只能跟蹤單個文件的歷史, 不過 Subversion 實做了一個 "虛擬" 的版本控管文件系統, 可以依時間跟蹤整個目錄的變更。 目錄和文件都能進行版本控制。網絡
自從CVS限制了文件的版本記錄,CVS並不支持那些可能發生在文件上,但會影響所在目錄內容的操做,如同複製和重命名。除此以外,在CVS裏你不能用擁有一樣名字可是沒有繼承老版本歷史或者根本沒有關係的文件替換一個已經歸入系統的文件。在Subversion中,你能夠增長(add)、刪除(delete)、複製(copy)和重命名(rename),不管是文件仍是目錄。全部的新加的文件都從一個新的、乾淨的版本開始。dom
一個提交動做,不是所有更新到了檔案庫中,就是徹底不更新。這容許開發人員以邏輯區間創建並提交變更,以防止當部分提交成功時出現的問題。ssh
每個文件與目錄都附有一組屬性關鍵字並和屬性值相關聯。你能夠建立, 並儲存任何你想要的Key/Value對。 屬性是隨着時間來做版本控管的,就像文件內容同樣。svn
Subversion 有抽象的檔案庫存取概念, 可讓人很容易地實做新的網絡機制。 Subversion 能夠做爲一個擴展模塊嵌入到Apache HTTP 服務器中。這個爲Subversion提供了很是先進的穩定性和協同工做能力,除此以外還提供了許多重要功能: 舉例來講, 有身份認證, 受權, 在線壓縮, 以及文件庫瀏覽等等。還有一個輕量級的獨立Subversion服務器, 使用的是自定義的通訊協議, 能夠很容易地經過 ssh 以 tunnel 方式使用。
Subversion 使用二進制差別算法來異表示文件的差別, 它對文字(人類可理解的)與二進制文件(人類沒法理解的) 兩類的文件都一視同仁。 這兩類的文件都一樣地以壓縮形式儲存在檔案庫中, 並且文件差別是以兩個方向在網絡上傳輸的。
在分支與標籤上的消耗並沒必要必定要與項目大小成正比。 Subversion 創建分支與標籤的方法, 就只是複製該項目, 使用的方法就相似於硬鏈接(hard-link)。 因此這些操做只會花費很小, 並且是固定的時間。
Subversion沒有任何的歷史包袱; 它主要是一羣共用的 C 程序庫, 具備定義完善的API。這使得 Subversion 便於維護, 而且可被其它應用程序與程序語言使用。
四,svn的好處
一、原子提交。一次提交不論是單個仍是多個文件,都是做爲一個總體提交的。在這當中發生的意外例如傳輸中斷,不會引發數據庫的不完整和數據損壞。
二、重命名、複製、刪除文件等動做都保存在版本歷史記錄當中。
三、對於二進制文件,使用了節省空間的保存方法。(簡單的理解,就是隻保存和上一版本不一樣之處)
四、目錄也有版本歷史。整個目錄樹能夠被移動或者複製,操做很簡單,並且可以保留所有版本記錄。
五、分支的開銷很是小。
六、優化過的數據庫訪問,使得一些操做沒必要訪問數據庫就能夠作到。這樣減小了不少沒必要要的和數據庫主機之間的網絡流量。
五,svn的基本使用方法
安裝:http://www.runoob.com/svn/svn-install.html
一、將文件checkout到本地目錄
svn checkout path(path是服務器上的目錄)
例如:svn checkout svn://192.168.1.1/pro/domain
簡寫:svn co
二、往版本庫中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加當前目錄下全部的php文件)
三、將改動的文件提交到版本庫
svn commit -m "LogMessage" [-N] [--no-unlock] PATH(若是選擇了保持鎖,就使用--no-unlock開關)
例如:svn commit -m "add test file for my test" test.php
簡寫:svn ci
四、加鎖/解鎖
svn lock -m "LockMessage" [--force] PATH
例如:svn lock -m "lock test file" test.php
svn unlock PATH
五、更新到某個版本
svn update -r m path
例如:
svn update若是後面沒有目錄,默認將當前目錄以及子目錄下的全部文件都更新到最新版本。
svn update -r 200 test.php(將版本庫中的文件test.php還原到版本200)
svn update test.php(更新,於版本庫同步。若是在提交的時候提示過時的話,是由於衝突,須要先update,修改文件,而後清除svn resolved,最後再提交commit)
簡寫:svn up
六、查看文件或者目錄狀態
1)svn status path(目錄下的文件和子目錄的狀態,正常狀態不顯示)
【?:不在svn的控制中;M:內容被修改;C:發生衝突;A:預約加入到版本庫;K:被鎖定】
2)svn status -v path(顯示文件和子目錄狀態)
第一列保持相同,第二列顯示工做版本號,第三和第四列顯示最後一次修改的版本號和修改人。
注:svn status、svn diff和 svn revert這三條命令在沒有網絡的狀況下也能夠執行的,緣由是svn在本地的.svn中保留了本地版本的原始拷貝。
簡寫:svn st
七、刪除文件
svn delete path -m "delete test fle"
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m "delete test file"
或者直接svn delete test.php 而後再svn ci -m 'delete test file‘,推薦使用這種
簡寫:svn (del, remove, rm)
八、查看日誌
svn log path
例如:svn log test.php 顯示這個文件的全部修改記錄,及其版本號的變化
九、查看文件詳細信息
svn info path
例如:svn info test.php
十、比較差別
svn diff path(將修改的文件與基礎版本比較)
例如:svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差別)
例如:svn diff -r 200:201 test.php
簡寫:svn di
十一、將兩個版本之間的差別合併到當前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(將版本200與205之間的差別合併到當前文件,可是通常都會產生衝突,須要處理一下)
十二、SVN 幫助
svn help
svn help ci
1三、版本庫下的文件和目錄列表
svn list path
顯示path目錄下的全部屬於版本庫的文件和目錄
簡寫:svn ls
1四、建立歸入版本控制下的新目錄 svn mkdir: 建立歸入版本控制下的新目錄。 用法: 一、mkdir PATH... 二、mkdir URL... 1五、恢復本地修改 svn revert: 恢復原始未改變的工做副本文件 (恢復大部份的本地修改)。revert: 用法: revert PATH... 注意: 本子命令不會存取網絡,而且會解除衝突的情況。可是它不會恢復 被刪除的目錄 1六、代碼庫URL變動 svn switch (sw): 更新工做副本至不一樣的URL。 用法: 一、switch URL [PATH] 二、switch --relocate FROM TO [PATH...] 一、更新你的工做副本,映射到一個新的URL,其行爲跟「svn update」很像,也會將 服務器上文件與本地文件合併。這是將工做副本對應到同一倉庫中某個分支或者標記的 方法。 二、改寫工做副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變更 (好比方案名或是主機名稱變更),可是工做副本仍舊對映到同一倉庫的同一目錄時使用 這個命令更新工做副本與倉庫的對應關係。 1七、解決衝突 svn resolved: 移除工做副本的目錄或文件的「衝突」狀態。 用法: resolved PATH... 注意: 本子命令不會依語法來解決衝突或是移除衝突標記;它只是移除衝突的 相關文件,而後讓 PATH 能夠再次提交。 1八、輸出指定文件或URL的內容。 svn cat 目標[@版本]...若是指定了版本,將從指定的版本開始查找。 svn cat -r PREV filename > filename (PREV 是上一版本,也能夠寫具體版本號,這樣輸出結果是能夠提交的)