引言:所謂版本控制,就是將多次操作的結(jié)果以日志的方式存儲(chǔ)下來,便于之后進(jìn)行恢復(fù)。版本控制并不是一個(gè)簡(jiǎn)單的軟件而是一套系統(tǒng),版本控制系統(tǒng)針對(duì)文件的變動(dòng)進(jìn)行監(jiān)控,記錄其數(shù)據(jù)變動(dòng)信息。其可以恢復(fù)目標(biāo)文件到之前的任意版本,并可比較兩個(gè)版本之間的差異。其支持多個(gè)用戶同時(shí)編輯同一個(gè)文件,能夠記錄哪個(gè)用戶什么時(shí)間修改該文件,為什么修改該文件。對(duì)于系統(tǒng)管理員來說,其對(duì)于腳本,文檔,配置文件等數(shù)據(jù)進(jìn)行的修改,都可以保存在版本控制體系中。
在Linux中提供了Subversion和CVS 兩款版本控制系統(tǒng),兩者在功能上沒有大的區(qū)別,但是前者比較新而且發(fā)展趨勢(shì)較好,因此推薦使用Subversion。
對(duì)于Subversion來說,其存儲(chǔ)理念是將文件存儲(chǔ)在集中式的倉(cāng)庫(kù)中,該倉(cāng)庫(kù)可以位于本地磁盤,也可以在遠(yuǎn)程主機(jī)上,通過SSH或者WebDav進(jìn)行訪問。
每個(gè)用戶在倉(cāng)庫(kù)中都有自己的工作目錄,用戶想使用版本控制體系中的項(xiàng)目文件,必須有自己的工作目錄。
當(dāng)用戶登錄后,在用戶的Home目錄或工作目錄中,會(huì)針對(duì)版本控制軟件會(huì)生成一個(gè)名為“.svn”的隱藏目錄,在其中存放版本控制軟件的元數(shù)據(jù)以及屬于用戶的文件。
注意:不要使用手動(dòng)的方法,來更改該隱藏目錄中的任何數(shù)據(jù)。
如果在某臺(tái)Linux用戶本機(jī)上配置了版本控制體系,并保存了所有的文檔,由于該機(jī)同時(shí)保持著倉(cāng)庫(kù)和用戶,因此用戶想使用倉(cāng)庫(kù)中的數(shù)據(jù),必須先將其下載后才可以對(duì)其進(jìn)行編輯,當(dāng)執(zhí)行提交修改的時(shí)刻,才上傳到倉(cāng)庫(kù)中。
因?yàn)橛袆e的用戶在該機(jī)上登錄,所以無法直接對(duì)倉(cāng)庫(kù)中的文件進(jìn)行編輯,倉(cāng)庫(kù)是加密的庫(kù),用戶無法看到的。
訪問倉(cāng)庫(kù)的方式有多種,對(duì)于存儲(chǔ)在本地的倉(cāng)庫(kù)來說,其格式為“file:///repo/path”。對(duì)于存在于遠(yuǎn)程主機(jī)上的倉(cāng)庫(kù)來說,其格式為“svn+ssh://hostname/repo/path”,這是對(duì)于SSH方式而言的。
對(duì) 于WebDav方 式來說,其格式為“http://hostname/repo/path”。只要執(zhí)行過一次和版本控制相關(guān)的指令,就會(huì)生成上述“.svn”目錄,其中記錄這一系列的元數(shù)據(jù),包含了服務(wù)器的地址和下載的項(xiàng)目名稱等內(nèi)容。這里以RHEL 6.0為例進(jìn)行說明。
當(dāng)建立一個(gè)空的倉(cāng)庫(kù)時(shí),必須以Root用戶執(zhí)行“svnadmin create /path”命令來實(shí)現(xiàn)。如果允許遠(yuǎn)程用戶使用SSH方式進(jìn)行訪問,需要配置sshd服務(wù),創(chuàng)建所需的賬戶。
如果使用Web方式進(jìn)行訪問,需要配置Web服務(wù)器(例如Apache等),并安裝“Mod_Dav_Svn”模塊,同時(shí)配置所需的虛擬賬戶。
在實(shí)際的工作中,為了便于管理,可以先創(chuàng)建一個(gè)目 錄(例 如“AllProject”)用來存放所有的項(xiàng)目,在該總目錄下創(chuàng)建一個(gè)子目 錄(例 如“dept”), 使用“svnadmin create /allproject/dept”命令,對(duì)其進(jìn)行初始化,創(chuàng)建一個(gè)新的項(xiàng)目。
當(dāng)然,該目錄也可以有該命令自動(dòng)創(chuàng)建。執(zhí)行“l(fā)l/allproject/dept”命 令,可以看到其中生成的所有數(shù)據(jù),其中的“db”目錄用來存放該項(xiàng)目中的所有文件。
為了便于開發(fā)人員使用該項(xiàng)目數(shù)據(jù),需要進(jìn)行必要的權(quán)限設(shè)定。執(zhí)行“groupadd dept”命令,創(chuàng)建名為“dept”的組。
執(zhí) 行“useradd user1-G dept”,“useradd user2-G dept”, 將“user1” 和“user2”用戶添加到該組中。
執(zhí)行“chgrp -Rdept /allproject/dept/db”命令,將“/allproject/dept/db”的屬組設(shè)定“dept”用戶組,即該組擁有對(duì)該項(xiàng)目的權(quán)限。
執(zhí)行“chmod -Rg+w /allproject/dept/db”命令,該組成員擁有對(duì)該目錄的寫權(quán)限。這樣,之后只要將用戶加入到該組中,就可以對(duì)該項(xiàng)目進(jìn)行開發(fā)。
對(duì)于老版本的Linux來說,可能還需要執(zhí)行“chmod 2770 /allproject/dept/db”命令,確保該目錄中所有新建的文件以及子目錄的權(quán)限與父目錄的屬組一致。
執(zhí) 行“yumlist subversion”命令,可以查看subversion包的安裝信息。
對(duì)于開發(fā)者來說,需要將對(duì)應(yīng)的項(xiàng)目文件導(dǎo)入進(jìn)來。 執(zhí) 行“echo 'export EDITOR=VIM' >>~/.bash_profile” 和“. ~/.bash_profile”命令,為其指定編輯器,將其放置到啟動(dòng)文件中,并讓其立即生效。
執(zhí)行“set|grep EDI”命令,可以看到編輯器設(shè)置成功。
例如項(xiàng)目文件位于“/var/pub/peizhi” 目 錄中,先進(jìn)入該目錄,執(zhí)行“svn import file:///allproject/dept”命令,在打開的編輯器中輸入合適的內(nèi)容后,保存后將其中的文件上傳到上述倉(cāng)庫(kù)中的項(xiàng)目目錄中。
注意:其默認(rèn)只上傳文本文件,而不是上傳二進(jìn)制文件。
以 上 述“dept” 組 中的“user1”賬戶身份登錄系統(tǒng),執(zhí)行“svn checkout file:///allproject/dept/”命令,將上述“dept”項(xiàng)目下載到本地。之后進(jìn)入下載得到的“dept”目錄,可以查看其中的文件,執(zhí)行各種編輯操作。
當(dāng)完成對(duì)應(yīng)的修改操作后,假設(shè)了修改了名為“filename”的文件,在“dept”目錄中執(zhí) 行“svn commit filename”命令,輸入關(guān)于該文件的修改說明信息后,執(zhí)行提交操作上傳到倉(cāng)庫(kù)中。
如 果 只 執(zhí) 行“svn commit”命令,可以自動(dòng)搜索提交所有變動(dòng)的文件。
當(dāng)然,對(duì)于該組中的其他用戶來說,也可以執(zhí)行同樣的操作。別的用戶要想及時(shí)了解項(xiàng)目中相關(guān)文件的變動(dòng)情況,可以執(zhí)行“svn update”命令來獲取更新信息。
執(zhí)行“svn add filexxx”命令,可以向項(xiàng)目中追加名為“filexxx”的文件,之后再執(zhí)行提交操作。該文件必須位于注入“dept”項(xiàng)目文件夾,而不能隨意將任何路徑中的文件追加上去。中執(zhí)行“svn delete filexxx”命令,可以從項(xiàng)目中刪除文件。
注意:這只是標(biāo)記為刪除,之后必須執(zhí)行提交操作方可。
執(zhí)行“svn info”命令,可以檢查項(xiàng)目的狀態(tài)信息,例如訪問地址,倉(cāng)庫(kù)根目錄,倉(cāng)庫(kù)ID等。
執(zhí)行“svn info -R”命令,可以查看其中每個(gè)文件的版本以及其詳細(xì)信息。執(zhí)行“svn status -vu”命令,也可以查看與之類似的狀態(tài)信息。
當(dāng)項(xiàng)目組中的某個(gè)用戶希望查看某文件的版本信息時(shí),可以執(zhí)行“svn log flname”命令,可以查看名為“finame”的文件的所有版本變動(dòng)信息.
其所有的修改記錄全部被顯示出來,包括具體的版本號(hào)(例如r1,r2等)、修改者賬戶名、修改時(shí)間、修改的行數(shù)以及說明信息等。
如果想查看其與指定版本號(hào)存在哪些區(qū)別,可以執(zhí)行“svn diff –r3 flname”命令,可以查看“flname”文件當(dāng)前版本和“r3”版本之間的區(qū)別,包括在哪些行數(shù)據(jù)發(fā)生了變化等。
當(dāng)在本地對(duì)項(xiàng)目中的某文件進(jìn)行了修改并存盤后,如果發(fā)現(xiàn)存在錯(cuò)誤話的,利用版本控制機(jī)制可以將其迅速恢復(fù)到修改之前的狀態(tài)。
執(zhí) 行“svn revert flname”命令,就可以放棄對(duì)“flname”文件的所有修改,放棄存盤恢復(fù)到修改之前的狀態(tài)。
當(dāng)然,這必須在執(zhí)行提交操作之前進(jìn)行。如果執(zhí)行了提交更新操作,則可以恢復(fù)到指定的版本。
執(zhí) 行“svn cat -r 1 flname > flname”命令,可以將“flname”文件恢復(fù)到“r1”版本狀態(tài)。
如果想基于Web方式訪問倉(cāng)庫(kù),可以先在目標(biāo)主機(jī)上安裝和配置好Apache服務(wù)。在該機(jī)上建立名為“Newgc”的目錄,其中包含“devep”文件夾。
執(zhí)行“svnadmin create/newgc/devep”命令,對(duì)其進(jìn)行初始化,創(chuàng)建一個(gè)新的項(xiàng)目。
執(zhí) 行“chown-R apache.apache /newgc/devep/db”命令,允許訪問Apache的用戶擁有針對(duì)該項(xiàng)目的是使用權(quán)限。
執(zhí) 行“mkdir /newgc/devep/dav”,創(chuàng) 建“dav”目錄,便于Apache在其中存儲(chǔ)數(shù)據(jù)。
執(zhí) 行“chown-R apache.apache /newgc/devep”命令,針對(duì)該“dav”目錄設(shè)置公開的訪問權(quán)限。
執(zhí) 行“yum install mod_dav_svn.x86_64”命令,安裝“mod_dav_svn”模塊。
執(zhí) 行“/etc/init.d/httpd restart”命令,重啟Apache進(jìn)程。
執(zhí)行“vim /etc/httpd/conf.d/subversion.conf”命 令,打 開“subversion.conf”配置文件,在其中可以看到一些示例說明信息,這里只是簡(jiǎn)單舉例,添加“