侯效永+李良偉++孫召+宋春雨+楊昊++韓霄松
摘 要: 軟件版本控制在軟件行業(yè)的作用十分重要,而大多數(shù)在校學(xué)生對(duì)版本控制的了解卻知之甚少。通過(guò)分析對(duì)比三大版本控制系統(tǒng)CVS、SVN、Git的優(yōu)缺點(diǎn),基于Git設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)吉林大學(xué)代碼托管平臺(tái)JLUCODE,通過(guò)Git協(xié)議與Web平臺(tái)實(shí)現(xiàn)本地與服務(wù)器的通訊。該平臺(tái)主要實(shí)現(xiàn)代碼托管、統(tǒng)計(jì)分析、論壇討論和作業(yè)管理等功能,以幫助學(xué)生學(xué)習(xí)、理解版本控制的意義,提升自身的能力,更好地管理源碼、完成作業(yè)。
關(guān)鍵詞: 版本控制; 代碼托管; Git; 代碼分析
中圖分類(lèi)號(hào):TP317 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2016)12-32-03
Abstract: Software version control plays a very important role in the software industry, but most of the students in the school know little about it. In view of this situation, the advantages and disadvantages of three revision control system, CVS, SVN, and Git are analyzed and compared in this paper. And a code hosting platform based on Git, JLUCODE, for the teachers and students of Jilin University is designed and implemented, the communications between local and server are realized through the Git protocol and Web platform. The platform mainly realizes the functions of code hosting, statistical analysis, forums and exercises management, to help students to learn and understand the meaning of version control, enhance their ability to better manage the source code, to complete the work.
Key words: version control; code hosting; Git; code analysis
0 引言
版本控制(Revision Control)是一種軟件工程技巧,借此能在軟件開(kāi)發(fā)的過(guò)程中,確保由不同人所編輯的同一代碼文件都得到同步[1]。軟件版本控制致力于幫助程序員管理他們的項(xiàng)目資產(chǎn),這是一門(mén)不可或缺的技術(shù),如若軟件的開(kāi)發(fā)沒(méi)有版本控制,開(kāi)發(fā)項(xiàng)目定然會(huì)岌岌可危[2-3]。
為了讓更多的程序員能有效并且更加簡(jiǎn)單地管理自己的源碼資產(chǎn),代碼托管便應(yīng)運(yùn)而生。代碼托管(Code Hosting)是基于版本控制系統(tǒng)開(kāi)發(fā)的,也可以說(shuō)是由版本控制系統(tǒng)派生出來(lái)的,只有以版本控制系統(tǒng)為基礎(chǔ)而設(shè)計(jì)開(kāi)發(fā)的代碼托管平臺(tái)才有其存在的必要,版本控制是代碼托管的基石,其優(yōu)劣也影響著托管平臺(tái)的優(yōu)劣[4-5]。
1 版本控制和代碼托管平臺(tái)
1.1 三大主流版本控制系統(tǒng)
在當(dāng)今的軟件開(kāi)發(fā)行業(yè)中,主流的版本控制系統(tǒng)分別是CVS(并發(fā)版本系統(tǒng))、SVN(集中式版本控制系統(tǒng))、Git(分布式版本控制系統(tǒng))。其中CVS出現(xiàn)最早,是1986年Dick Grune為了解決社區(qū)人員分散、合作不便等問(wèn)題設(shè)計(jì)開(kāi)發(fā)的一個(gè)版本控制工具。而SVN則是CollabNet為了彌補(bǔ)CVS在使用中所發(fā)現(xiàn)的不足,于2000年開(kāi)發(fā)完成并發(fā)布的另一款版本控制工具。Git是于2005年發(fā)布的,主要是由于Bitkeeper收回對(duì)Linux社區(qū)的授權(quán),Linus不愿使用CVS等其他版本控制工具而研發(fā)出來(lái)。表1展示三者功能的簡(jiǎn)單對(duì)比。
網(wǎng)絡(luò)速度的快慢,決定著版本控制軟件將代碼提交到服務(wù)器上的進(jìn)度,網(wǎng)速慢可能導(dǎo)致開(kāi)發(fā)不連貫。而Git的許多操作都在本地完成,不同于CVS及SVN每次提交都需要與服務(wù)器交互,只需將一個(gè)階段性或最終版本提交到服務(wù)器。如此,以Git作為代碼托管平臺(tái)的版本控制系統(tǒng),只需在網(wǎng)絡(luò)良好的時(shí)候,向托管平臺(tái)提交便可,既方便又不影響開(kāi)發(fā)。
1.1.2 Git的原子提交方式優(yōu)勢(shì)更大
CVS每次提交都是對(duì)單個(gè)文件進(jìn)行版本的分別修改,Git則簡(jiǎn)易得多,Git是根據(jù)SHA-1算法生成惟一commitid[4]。因此,當(dāng)想跟蹤以前某次提交的代碼時(shí),不需要考慮到底提交了哪些文件,所有代碼會(huì)一次性的提取出來(lái)。相比之下,Git在這方面更占優(yōu)勢(shì)。
1.1.3 Git合并分支簡(jiǎn)易得多[6]
無(wú)論是建立新的分支,還是在分支之間切換,相比CVS等版本控制系統(tǒng),Git的分支管理則容易許多,它只需要一條命令即可完成,不需要再去新建多余的目錄。而且,分支合并之后,提交的歷史并沒(méi)有清除,而是依然保留,這樣更加有助于分支的管理和追蹤。
1.2 優(yōu)秀代碼托管平臺(tái)簡(jiǎn)介
SourceForge是一個(gè)基于Web的服務(wù),提供了一個(gè)源代碼庫(kù),下載鏡像,bug跟蹤等功能。它作為軟件開(kāi)發(fā)人員可以用它來(lái)控制和管理的中心位置自由和開(kāi)放源碼軟件的開(kāi)發(fā)。雖然SourceForge上是第一個(gè)提供代碼托管服務(wù)的免費(fèi)開(kāi)源項(xiàng)目,但許多用戶(hù)和項(xiàng)目現(xiàn)在已經(jīng)轉(zhuǎn)移到GitHub上,或其他軟件托管設(shè)施,亦或自托管他們的軟件。
GitHub是一個(gè)利用Git進(jìn)行版本控制、專(zhuān)門(mén)用于存放軟件代碼與內(nèi)容的共享虛擬主機(jī)服務(wù)。它由GitHub公司的開(kāi)發(fā)者Chris Wanstrath、PJ Hyett和Tom Preston-Werner使用Ruby on Rails編寫(xiě)而成。截止2015年,GitHub已經(jīng)成為世界上代碼存放量最大的網(wǎng)站。然而,GitHub在國(guó)內(nèi)也遭遇許多困難,網(wǎng)絡(luò)封鎖、中間人攻擊、DOS攻擊、旁觀者攻擊等。當(dāng)然這些也并沒(méi)有影響它在代碼托管中“霸主”的地位。
上述三個(gè)托管平臺(tái)都是由國(guó)外的公司研發(fā)的,國(guó)內(nèi)的Git@OSC是開(kāi)源中國(guó)社區(qū)所設(shè)計(jì)開(kāi)發(fā)的一款基于Git版本控制系統(tǒng)的代碼托管平臺(tái)。由于開(kāi)源中國(guó)積累了大量用戶(hù),在Git@OSC推出后,便受到了許多人的關(guān)注,因?yàn)镚itHub的一些不穩(wěn)定因素,所以許多人都希望Git@OSC能取代GitHub在中國(guó)的地位。然而,Git@OSC想要超越GitHub在國(guó)內(nèi)的地位,還是比較困難的。而大多數(shù)代碼托管平臺(tái)都是基于Git開(kāi)發(fā)的,如Gitlab、BitBucket等,Git已然成為一股潮流。因此我們搭建的代碼托管平臺(tái)同樣以Git為基礎(chǔ)。
雖然國(guó)外的代碼托管平臺(tái)功能齊全,但是由于網(wǎng)絡(luò)原因,服務(wù)并不穩(wěn)定,而國(guó)內(nèi)的托管平臺(tái)少有完全免費(fèi)的。所以為了有效的管理代碼,方便師生增強(qiáng)對(duì)版本控制的理解,提高開(kāi)發(fā)效率,避免重復(fù)開(kāi)發(fā),我們?cè)O(shè)計(jì)并開(kāi)發(fā)JLUCODE。
2 JLUCODE平臺(tái)介紹
本平臺(tái)采用B/S[7](Browser/Server)結(jié)構(gòu),訪問(wèn)本平臺(tái)無(wú)需考慮用戶(hù)所使用的系統(tǒng)環(huán)境,只需有瀏覽器(即B端)和網(wǎng)絡(luò)即可訪問(wèn)我們的服務(wù)器(即S端)。
2.1 功能簡(jiǎn)介
本平臺(tái)面向的用戶(hù)是高校師生,主要功能結(jié)構(gòu)如圖1所示。
[JLUCODE系統(tǒng)][教學(xué)模塊][用戶(hù)管理][版本庫(kù)模塊][數(shù)據(jù)分析][論壇模塊][作業(yè)評(píng)分][設(shè)置答案][發(fā)布作業(yè)][用戶(hù)驗(yàn)證][修改用戶(hù)][添加用戶(hù)][源碼查看][歷史版本][創(chuàng)建庫(kù)][分析總結(jié)][分類(lèi)分析][單庫(kù)分析][進(jìn)行討論][發(fā)布話(huà)題][創(chuàng)建話(huà)題]
2.1.1 版本庫(kù)操作的基本功能
用戶(hù)可以在本地通過(guò)Git工具、Git命令行或者一些開(kāi)發(fā)工具的Git插件將代碼同步到我們的服務(wù)器。版本庫(kù)一般通過(guò)JLUCODE直接在網(wǎng)上創(chuàng)建,創(chuàng)建時(shí)可以對(duì)版本庫(kù)的訪問(wèn)策略進(jìn)行設(shè)置,如限制推送(授權(quán)訪問(wèn)、指定用戶(hù))、限制克隆,推送以及限制查看,克隆和推送等。用戶(hù)可以通過(guò)Git將版本庫(kù)提交、同步到平臺(tái)服務(wù)器中,然后平臺(tái)站點(diǎn)獲取服務(wù)器中的版本庫(kù)數(shù)據(jù),并以網(wǎng)頁(yè)形式展示出來(lái)。除此以外,具有權(quán)限的用戶(hù)可以查看版本庫(kù)的各分支的差異,查看指定版本庫(kù)的提交次數(shù)及每次提交的所有源代碼。
2.1.2 版本庫(kù)源代碼的分析功能
JLUCODE提供對(duì)版本庫(kù)的源代碼行數(shù)、有效代碼行數(shù)(總行數(shù)-注釋行數(shù)-空行行數(shù))等屬性進(jìn)行分析,并且提供同一版本庫(kù)各分支的數(shù)據(jù)視圖,如圖2。除了提供對(duì)單個(gè)版本庫(kù)分析,我們還提供對(duì)不同開(kāi)發(fā)語(yǔ)言進(jìn)行分類(lèi)的分析。這些數(shù)據(jù)會(huì)生成報(bào)表,能以PDF格式導(dǎo)出,作為個(gè)人求職和升學(xué)的佐證。
2.1.3 論壇功能
JLUCODE還提供BBS論壇功能,開(kāi)發(fā)人員及廣大用戶(hù)可以在此互相交流解決疑惑。
2.1.4 教學(xué)功能
JLUCODE面向我校師生,我們?yōu)閹熒峁┝俗鳂I(yè)功能。通過(guò)JLUCODE,教師在平臺(tái)發(fā)布作業(yè),學(xué)生只需將本地代碼同步到平臺(tái)之中,然后將對(duì)應(yīng)源碼庫(kù)設(shè)為作業(yè)答案源碼庫(kù)即可。
2.2 實(shí)現(xiàn)技術(shù)
平臺(tái)前端頁(yè)面采用框架Bootstrap進(jìn)行排布設(shè)計(jì),結(jié)合HTML、CSS等前端技術(shù)實(shí)現(xiàn)。后臺(tái)程序以ThinkPHP為框架,以PHP為主要開(kāi)發(fā)語(yǔ)言,通過(guò)PHP實(shí)現(xiàn)數(shù)據(jù)的操作,后臺(tái)與數(shù)據(jù)庫(kù)MySQL的連接、查詢(xún)、編輯等數(shù)據(jù)交互是通過(guò)PDO數(shù)據(jù)對(duì)象來(lái)實(shí)現(xiàn)。ThinkPHP是一個(gè)快速、兼容而且簡(jiǎn)單的輕量級(jí)國(guó)產(chǎn)PHP開(kāi)發(fā)框架,誕生于2006年初,原名FCS,2007年正式更名為T(mén)hinkPHP,遵循Apache2開(kāi)源協(xié)議發(fā)布,從Struts[8]結(jié)構(gòu)移植過(guò)來(lái)并做了改進(jìn)和完善,使用面向?qū)ο蟮拈_(kāi)發(fā)結(jié)構(gòu)和MVC模式[9];然后在服務(wù)器搭建Git服務(wù),以使本地Git客戶(hù)端可正常與服務(wù)器通信。后臺(tái)通過(guò)PHP獲取服務(wù)器中Git的信息,并在前端通過(guò)AJAX或者表單請(qǐng)求數(shù)據(jù)時(shí),將數(shù)據(jù)返回,并顯示在頁(yè)面中。圖3為本平臺(tái)的技術(shù)框架。
3 結(jié)束語(yǔ)
代碼托管平臺(tái)彌補(bǔ)了許多開(kāi)發(fā)者對(duì)使用版本控制系統(tǒng)上手慢的問(wèn)題,對(duì)于軟件開(kāi)發(fā)具有舉足輕重的作用,在很大程度上保證程序代碼安全的同時(shí),還使身處異地的團(tuán)隊(duì)成員可以同步開(kāi)發(fā),不至影響進(jìn)度,從而提高開(kāi)發(fā)效率。本文構(gòu)建的JLUCODE平臺(tái)不僅解決了上述問(wèn)題,更是將托管平臺(tái)服務(wù)的開(kāi)發(fā)者市場(chǎng)由社會(huì)向高校轉(zhuǎn)移,讓眾多在校學(xué)生接觸到代碼托管服務(wù),增強(qiáng)版本控制意識(shí)。下一步的工作重點(diǎn)是將JLUCODE進(jìn)行大力推廣,讓更多的學(xué)生了解并學(xué)會(huì)使用代碼托管平臺(tái)。
參考文獻(xiàn)(References):
[1] Wikipedia contributors. Revision Control System [G/OL].
Wikipedia,2015(20150122) [2016-03-30].
[2] C.Micbael Pilato.使用Subversion進(jìn)行版本控制 [M].開(kāi)明出
版社,2009.
[3] Eric Brechner.代碼之殤[M].機(jī)械工業(yè)出版社, 2013.
[4] 蔣鑫.Git權(quán)威指南[M].機(jī)械工業(yè)出版社,2011.
[5] 羅力格(Jon Loeliger).Git版本控制管理[M].東南大學(xué)出版
社,2010.
[6] 宋冬生.Git——版本管理之利器[J].程序員,2007.11:
118-119
[7] 李云云.淺析B/S和C/S體系結(jié)構(gòu)[J].科學(xué)之友,2011.1:6-8
[8] 高宇靖.基于MVC設(shè)計(jì)模式的Struts框架的探索[D].吉林大
學(xué)碩士學(xué)位論文,2004.
[9] 李霞.MVC設(shè)計(jì)模式的原理與實(shí)現(xiàn)[D].吉林大學(xué)碩士學(xué)位論
文,2004.