在linux中,cvs全稱“Concurrent Version System”,中文意思為“代碼版本控制軟件”,它是一種GNU軟件包,主要用于在多人開發(fā)環(huán)境下源碼的維護(hù)。CVS可以維護(hù)任意文檔的開發(fā)和使用,例如共享文件的編輯修改,而不僅僅局限于程序設(shè)計(jì);CVS維護(hù)的文件類型可以是文本類型也可以是二進(jìn)制類型。CVS基于客戶端/服務(wù)器的行為使其可容納多個用戶。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
linux中的cvs
CVS(Concurrent Versions System,代碼版本控制軟件),是一種GNU軟件包,主要用于在多人開發(fā)環(huán)境下源碼的維護(hù)。與它相類似的代碼版本控制軟件有subversion。多個開發(fā)人員通過一個中心版本控制系統(tǒng)來記錄文件版本,從而達(dá)到保證文件同步的目的。CVS版本控制系統(tǒng)是一種GNU軟件包,主要用于在多人開發(fā)環(huán)境下的源碼的維護(hù)。但是由于之前CVS編碼的問題,大多數(shù)軟件開發(fā)公司都使用SVN替代了CVS。
Concurrent有并發(fā)的、協(xié)作的、一致的等含義。實(shí)際上CVS可以維護(hù)任意文檔的開發(fā)和使用,例如共享文件的編輯修改,而不僅僅局限于程序設(shè)計(jì)。CVS維護(hù)的文件類型可以是文本類型也可以是二進(jìn)制類型。
CVS用Copy-Modify-Merge(拷貝、修改、合并)變化表支持對文件的同時訪問和修改。它明確地將源文件的存儲和用戶的工作空間獨(dú)立開來,并使其并行操作。
CVS基于客戶端/服務(wù)器的行為使其可容納多個用戶。這一特性使得CVS成為位于不同地點(diǎn)的人同時處理數(shù)據(jù)文件(特別是程序的源代碼)時的首選。
工作思路
在一臺服務(wù)器上建立一個源代碼庫,庫里可以存放許多不同項(xiàng)目的源程序。由源代碼庫管理員統(tǒng)一管理這些源程序。每個用戶在使用源代碼庫之前,首先要把源代碼庫里的項(xiàng)目文件下載到本地,然后用戶可以在本地任意修改,最后用CVS命令進(jìn)行提交,由CVS源代碼庫統(tǒng)一管理修改。這樣,就好像只有一個人在修改文件一樣,既避免了沖突,又可以做到跟蹤文件變化等。
CVS是并發(fā)版本系統(tǒng)(Concurrent Versions System)的意思,主流的開放源碼網(wǎng)絡(luò)透明的版本控制系統(tǒng)。CVS對于從個人開發(fā)者到大型、分布團(tuán)隊(duì)都是有用的。
它的客戶機(jī)/服務(wù)器存取方法使得開發(fā)者可以從任何因特網(wǎng)的接入點(diǎn)存取最新的代碼。它的無限制的版本管理檢出(check out:注1)的模式避免了通常的因?yàn)榕潘鼨z出模式而引起的人工沖突。它的客戶端工具可以在絕大多數(shù)的平臺上使用。
CVS被應(yīng)用于流行的開放源碼工程中,像Mozilla,GIMP,XEmacs,KDE和GNOME等。那么它到底怎么樣。
你可能會說,它非常棒,但是對于"我"來說它能做什么。首先,基本的 :一個版本控制系統(tǒng)保持了對一系列文件所作改變的歷史記錄。對于一個開發(fā)者來說,那就意味著在你對一個程序所進(jìn)行開發(fā)的整個期間,能夠跟蹤對其所作的所有改動的痕跡。對你來說,有沒有出現(xiàn)過由于在命令行上按錯鍵而導(dǎo)致一天的工作都白費(fèi)的情況呢。版本控制系統(tǒng)給了你一個安全的網(wǎng)絡(luò)。
版本控制系統(tǒng)對任何人都有用,真的。(畢竟,誰不愿意使用一個安全的網(wǎng)絡(luò)呢。)它們經(jīng)常被軟件開發(fā)團(tuán)隊(duì)使用。在團(tuán)隊(duì)中工作的開發(fā)者需要能夠調(diào)整他們的各自的修改;一個集中式版本控制系統(tǒng)允許那樣做。
代碼調(diào)整
在傳統(tǒng)的版本控制系統(tǒng)中,一個開發(fā)者檢出一個文件,修改它,然后將其登記回去。檢出文件的開發(fā)者擁有對這個文件修改的排它權(quán)。沒有其它的開發(fā)者可以檢出這個文件– 并且只有檢出那個文件的開發(fā)者可以登記(check in:注2)所做的修改。(當(dāng)然對于管理員有很多方法可以超越這個限制。)
想一下排它的檢出可能會如何工作:Bob的兄弟檢出 foo.java以便加入注釋,寫好代碼后他什么也沒做。然后他去吃午飯了。Bob吃完午飯后,發(fā)現(xiàn)他的老板所指給他的一個bug在 foo.java里。他試圖簽出 foo.java … 但是版本控制系統(tǒng)不允許他這樣做,因?yàn)樗男值芤呀?jīng)把它簽出了。Bob不得不等著他的兄弟吃完午飯回來(在這個"好"日子用了兩個小時),他才可以修正bug。
在一個大型的開放源碼工程中,因?yàn)殚_發(fā)者可能在任意的時區(qū)工作得很晚,給予一個開發(fā)者阻止任意地方的其它開發(fā)者繼續(xù)處理任意文件的能力很明顯無法運(yùn)轉(zhuǎn)。他們最終將因?yàn)椴荒軌蛟谒麄兿胍臅r候開展項(xiàng)目而感到厭煩。
CVS通過它的無限制的簽出模式解決了這個問題。簽出一個文件并不給定開發(fā)者對那個文件的排它權(quán)。其它的開發(fā)者也可以對其檢出,進(jìn)行他們自己的修改,并且將其登記回去。
"等一下"你可能會說。"但是后面的登記不是會覆蓋前面的嗎"回答是不會。詳細(xì)地回答就是當(dāng)多個開發(fā)者對同一個文件作了修改CVS會檢測,并且自動合并那些改變。
哇噢。自動的,不用擔(dān)心 — CVS 會很小心,并且將會自動合并那些只要不是對代碼的同一行所作的改動。如果CVS不能安全的處理這些改動,開發(fā)者將不得不手工合并它們。從此去往何處。
有大量在許多平臺上可用的CVS附加工具,它們給CVS增加了功能或使得CVS更容易使用。
使用好處
-
修改軟件時可能會不知不覺混進(jìn)一些bug,而且可能過了很久你才會察覺到它們的存在。有了 cvs,你可以很容易地恢復(fù)舊版本,并從中看出到底是哪個修改導(dǎo)致了這個bug。有時這是很有用的。
-
cvs 用一種聰明的辦法把一個文件的所有版本保存在一個文件里,僅僅保存不同版本之間的差異。
-
cvs 最初由 Dick Grune 在 1986 年 12 月以 shell腳本的形式發(fā)布在 comp.sources.unix 的新聞組第 6 卷里;1989 年 4 月,Brian Berliner 設(shè)計(jì)了 cvs 并編寫了代碼。之后 Jeff Polk 幫助 Brian 設(shè)計(jì)了 cvs 模塊和銷售商分支支持。
-
cvs 不能指導(dǎo)你如何構(gòu)造什么。它只是將你所設(shè)計(jì)的一種樹結(jié)構(gòu)文件保存下來以備恢復(fù)之用。
-
cvs 不能決定如何在一個檢出工作目錄使用磁盤空間。如果你在每一個目錄中都寫下 Makefile 或腳本,且必須知道其它一切的相對位置,有時不得不檢出整個倉庫。
-
如果你將你的工作模塊化,并且建立了一個共享文件的 build 系統(tǒng)(通過links,mounts,Makefiles 里的 VPATH 等),你就可以隨意安排磁盤的使用。
-
你應(yīng)該在 cvs 下放一個工具來支持這樣一個構(gòu)造系統(tǒng)(腳本、Makefile 等等)。
-
有些變化發(fā)生在 cvs 范圍之外時,要想想什么文件需要重建。一個傳統(tǒng)的方法是用 make 來構(gòu)造,并用一些自動化的工具來產(chǎn)生 make 所用的相關(guān)文件。