Subversion(SVN) 是一個開源的版本控制系統(tǒng), 也就是說 Subversion 管理著隨時間改變的數(shù)據(jù)拿霉。 這些數(shù)據(jù)放置在一個中央資料檔案庫(repository) 中鸵闪。 這個檔案庫很像一個普通的文件服務器, 不過它會記住每一次文件的變動撼短。 這樣你就可以把檔案恢復到舊的版本, 或是瀏覽文件的變動歷史蔚袍。
SVN 的一些概念
repository(源代碼庫):源代碼統(tǒng)一存放的地方
Checkout(提认团!):當你手上沒有源代碼的時候邪蛔,你需要從 repository checkout 一份
Commit(提交):當你已經修改了代碼蜂大,你就需要Commit到repository
Update (更新):當你已經 checkout 了一份源代碼, update 一下你就可以和Repository上的源代碼同步疏橄,你手上的代碼就會有最新的變更
日常開發(fā)過程其實就是這樣的(假設你已經Checkout并且已經工作了幾天):Update(獲得最新的代碼) -->作出自己的修改并調試成功 --> Commit(大家就可以看到你的修改了) 占拍。
如果兩個程序員同時修改了同一個文件呢, SVN 可以合并這兩個程序員的改動,實際上 SVN 管理源代碼是以行為單位的软族,就是說兩個程序員只要不是修改了同一行程序刷喜,SVN 都會自動合并兩種修改残制。如果是同一行立砸,SVN 會提示文件 Conflict, 沖突,需要手動確認初茶。
SVN 的主要功能
(1)目錄版本控制
CVS 只能跟蹤單個文件的歷史, 不過 Subversion 實作了一個 "虛擬" 的版本控管文件系統(tǒng), 能夠依時間跟蹤整個目錄的變動颗祝。 目錄和文件都能進行版本控制。
(2)真實的版本歷史
自從 CVS 限制了文件的版本記錄恼布,CVS 并不支持那些可能發(fā)生在文件上螺戳,但會影響所在目錄內容的操作,如同復制和重命名折汞。除此之外倔幼,在 CVS 里你不能用擁有同樣名字但是沒有繼承老版本歷史或者根本沒有關系的文件替換一個已經納入系統(tǒng)的文件。在 Subversion 中爽待,你可以增加(add)损同、刪除(delete)、復制(copy)和重命名(rename)鸟款,無論是文件還是目錄膏燃。所有的新加的文件都從一個新的、干凈的版本開始何什。
(3)自動提交
一個提交動作组哩,不是全部更新到了檔案庫中,就是不完全更新。這允許開發(fā)人員以邏輯區(qū)間建立并提交變動伶贰,以防止當部分提交成功時出現(xiàn)的問題蛛砰。
(4)納入版本控管的元數(shù)據(jù)
每一個文件與目錄都附有一組屬性關鍵字并和屬性值相關聯(lián)。你可以創(chuàng)建, 并儲存任何你想要的Key/Value對黍衙。 屬性是隨著時間來作版本控管的,就像文件內容一樣暴备。
(5)選擇不同的網絡層
Subversion 有抽象的檔案庫存取概念, 可以讓人很容易地實作新的網絡機制。 Subversion 可以作為一個擴展模塊嵌入到 Apache HTTP 服務器中们豌。這個為 Subversion 提供了非常先進的穩(wěn)定性和協(xié)同工作能力涯捻,除此之外還提供了許多重要功能: 舉例來說, 有身份認證, 授權, 在線壓縮, 以及文件庫瀏覽等等。還有一個輕量級的獨立 Subversion 服務器望迎, 使用的是自定義的通信協(xié)議, 可以很容易地通過 ssh 以 tunnel 方式使用障癌。
(6)一致的數(shù)據(jù)處理方式
Subversion 使用二進制差異算法來異表示文件的差異, 它對文字(人類可理解的)與二進制文件(人類無法理解的) 兩類的文件都一視同仁。 這兩類的文件都同樣地以壓縮形式儲存在檔案庫中, 而且文件差異是以兩個方向在網絡上傳輸?shù)摹?/p>
(7)有效的分支(branch)與標簽(tag)
在分支與標簽上的消耗并不必一定要與項目大小成正比辩尊。 Subversion 建立分支與標簽的方法, 就只是復制該項目, 使用的方法就類似于硬連接(hard-link)涛浙。 所以這些操作只會花費很小, 而且是固定的時間。
(8)Hackability
Subversion沒有任何的歷史包袱; 它主要是一群共用的 C 程序庫, 具有定義完善的API摄欲。這使得 Subversion 便于維護, 并且可被其它應用程序與程序語言使用轿亮。
優(yōu)于 CVS 之處
1、原子提交:一次提交不管是單個還是多個文件胸墙,都是作為一個整體提交的我注,所以要么全部提交成功,要么就是全部不成功迟隅,這樣就不會引起數(shù)據(jù)庫的不完整和數(shù)據(jù)損壞但骨。
2、重命名智袭、復制奔缠、刪除文件等動作都保存在版本歷史記錄當中。
3吼野、對于二進制文件校哎,使用了節(jié)省空間的保存方法。(簡單的理解瞳步,就是只保存和上一版本不同之處)
4闷哆、目錄也有版本歷史。整個目錄樹可以被移動或者復制谚攒,操作很簡單阳准,而且能夠保留全部版本記錄。
5馏臭、分支的開銷非常小野蝇。
6讼稚、優(yōu)化過的數(shù)據(jù)庫訪問,使得一些操作不必訪問數(shù)據(jù)庫就可以做到绕沈。這樣減少了很多不必要的和數(shù)據(jù)庫主機之間的網絡流量锐想。
?SVN 生命周期
創(chuàng)建版本庫
版本庫相當于一個集中的空間,用于存放開發(fā)者所有的工作成果乍狐。版本庫不僅能存放文件赠摇,還包括了每次修改的歷史,即每個文件的變動歷史浅蚪。
Create 操作是用來創(chuàng)建一個新的版本庫藕帜。大多數(shù)情況下這個操作只會執(zhí)行一次。當你創(chuàng)建一個新的版本庫的時候惜傲,你的版本控制系統(tǒng)會讓你提供一些信息來標識版本庫洽故,例如創(chuàng)建的位置和版本庫的名字。
檢出
Checkout 操作是用來從版本庫創(chuàng)建一個工作副本盗誊。工作副本是開發(fā)者私人的工作空間时甚,可以進行內容的修改,然后提交到版本庫中哈踱。
更新
顧名思義荒适,update 操作是用來更新版本庫的。這個操作將工作副本與版本庫進行同步开镣。由于版本庫是由整個團隊共用的刀诬,當其他人提交了他們的改動之后,你的工作副本就會過期哑子。
讓我們假設 Tom 和 Jerry 是一個項目的兩個開發(fā)者舅列。他們同時從版本庫中檢出了最新的版本并開始工作。此時卧蜓,工作副本是與版本庫完全同步的。然后把敞,Jerry 很高效的完成了他的工作并提交了更改到版本庫中弥奸。
此時 Tom 的工作副本就過期了。更新操作將會從版本庫中拉取 Jerry 的最新改動并將 Tom 的工作副本進行更新奋早。
執(zhí)行變更
當檢出之后盛霎,你就可以做很多操作來執(zhí)行變更。編輯是最常用的操作耽装。你可以編輯已存在的文件愤炸,例如進行文件的添加/刪除操作。
你可以添加文件/目錄掉奄。但是這些添加的文件目錄不會立刻成為版本庫的一部分规个,而是被添加進待變更列表中,直到執(zhí)行了 commit 操作后才會成為版本庫的一部分。
同樣地你可以刪除文件/目錄诞仓。刪除操作立刻將文件從工作副本中刪除掉缤苫,但該文件的實際刪除只是被添加到了待變更列表中,直到執(zhí)行了 commit 操作后才會真正刪除墅拭。
Rename 操作可以更改文件/目錄的名字活玲。"移動"操作用來將文件/目錄從一處移動到版本庫中的另一處。
復查變化
當你檢出工作副本或者更新工作副本后谍婉,你的工作副本就跟版本庫完全同步了舒憾。但是當你對工作副本進行一些修改之后,你的工作副本會比版本庫要新穗熬。在 commit 操作之前復查下你的修改是一個很好的習慣珍剑。
Status 操作列出了工作副本中所進行的變動。正如我們之前提到的死陆,你對工作副本的任何改動都會成為待變更列表的一部分招拙。Status 操作就是用來查看這個待變更列表。
Status 操作只是提供了一個變動列表措译,但并不提供變動的詳細信息别凤。你可以用 diff 操作來查看這些變動的詳細信息。
修復錯誤
我們來假設你對工作副本做了許多修改领虹,但是現(xiàn)在你不想要這些修改了规哪,這時候 revert 操作將會幫助你。
Revert 操作重置了對工作副本的修改塌衰。它可以重置一個或多個文件/目錄诉稍。當然它也可以重置整個工作副本。在這種情況下最疆,revert 操作將會銷毀待變更列表并將工作副本恢復到原始狀態(tài)杯巨。
解決沖突
合并的時候可能會發(fā)生沖突。Merge 操作會自動處理可以安全合并的東西努酸。其它的會被當做沖突服爷。例如,"hello.c" 文件在一個分支上被修改获诈,在另一個分支上被刪除了仍源。這種情況就需要人為處理。Resolve 操作就是用來幫助用戶找出沖突并告訴版本庫如何處理這些沖突舔涎。
提交更改
Commit 操作是用來將更改從工作副本到版本庫笼踩。這個操作會修改版本庫的內容,其它開發(fā)者可以通過更新他們的工作副本來查看這些修改亡嫌。
在提交之前嚎于,你必須將文件/目錄添加到待變更列表中掘而。列表中記錄了將會被提交的改動。當提交的時候匾旭,我們通常會提供一個注釋來說明為什么會進行這些改動镣屹。這個注釋也會成為版本庫歷史記錄的一部分。Commit 是一個原子操作价涝,也就是說要么完全提交成功女蜈,要么失敗回滾。用戶不會看到成功提交一半的情況色瘩。
大家快來一起學習 svn 分布式版本控制系統(tǒng)伪窖,缺乏機器練手的小伙伴可以去 cnaaa 看一看!