版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SVN用戶(hù)使用指南Version 1.0文檔變更記錄文件狀態(tài): 草稿 正式發(fā)布 當(dāng)前版本:V1.0作 者:wanghj審 核 人:發(fā)布日期:修訂號(hào)修改內(nèi)容描述修改人修改日期備注目 錄 TOC o 1-3 h z u HYPERLINK l _Toc237319714 1. 引言 PAGEREF _Toc237319714 h 1 HYPERLINK l _Toc237319715 1.1. 目的 PAGEREF _Toc237319715 h 1 HYPERLINK l _Toc237319716 1.2. 范圍 PAGEREF _Toc237319716 h 1 HYPERLINK l _T
2、oc237319717 2. SVN根底知識(shí) PAGEREF _Toc237319717 h 1 HYPERLINK l _Toc237319718 2.1. SVN簡(jiǎn)介 PAGEREF _Toc237319718 h 1 HYPERLINK l _Toc237319719 2.2. SVN特性 PAGEREF _Toc237319719 h 1 HYPERLINK l _Toc237319720 2.3. SVN的架構(gòu) PAGEREF _Toc237319720 h 3 HYPERLINK l _Toc237319721 3. SVN的根本應(yīng)用 PAGEREF _Toc237319721 h
3、 4 HYPERLINK l _Toc237319722 3.1. 客戶(hù)端的安裝 PAGEREF _Toc237319722 h 4 HYPERLINK l _Toc237319723 3.2. 版本庫(kù)瀏覽 Repo-browser PAGEREF _Toc237319723 h 6 HYPERLINK l _Toc237319724 3.3. 版本庫(kù)的根本操作 PAGEREF _Toc237319724 h 8 HYPERLINK l _Toc237319725 3.3.1. Add filefolder添加文件(文件夾) PAGEREF _Toc237319725 h 8 HYPERLIN
4、K l _Toc237319726 3.3.2. commit 提交 PAGEREF _Toc237319726 h 9 HYPERLINK l _Toc237319727 3.3.3. Show log 查看日志 PAGEREF _Toc237319727 h 9 HYPERLINK l _Toc237319728 3.3.4. Export 導(dǎo)出 PAGEREF _Toc237319728 h 11 HYPERLINK l _Toc237319729 3.3.5. Revision graph 版本樹(shù)顯示 PAGEREF _Toc237319729 h 12 HYPERLINK l _To
5、c237319730 3.3.6. Check out 檢出 PAGEREF _Toc237319730 h 13 HYPERLINK l _Toc237319731 3.3.7. Refresh 刷新 PAGEREF _Toc237319731 h 13 HYPERLINK l _Toc237319732 3.3.8. Delete 刪除 PAGEREF _Toc237319732 h 14 HYPERLINK l _Toc237319733 3.3.9. Rename 對(duì)目錄或文件進(jìn)行改名 PAGEREF _Toc237319733 h 14 HYPERLINK l _Toc2373197
6、34 3.3.10. Copy to working copy 把當(dāng)前目錄拷貝到本地 PAGEREF _Toc237319734 h 15 HYPERLINK l _Toc237319735 3.3.11. Copy to 拷貝到 PAGEREF _Toc237319735 h 16 HYPERLINK l _Toc237319736 3.4. 客戶(hù)端操作 PAGEREF _Toc237319736 h 17 HYPERLINK l _Toc237319737 3.4.1. 客戶(hù)端的根本操作 PAGEREF _Toc237319737 h 17 HYPERLINK l _Toc23731973
7、8 3.4.2. 常用功能介紹 PAGEREF _Toc237319738 h 20 HYPERLINK l _Toc237319739 3.4.3. 分支與合并 PAGEREF _Toc237319739 h 23 HYPERLINK l _Toc237319740 4. SVN API PAGEREF _Toc237319740 h 25 HYPERLINK l _Toc237319741 4.1. 使用API PAGEREF _Toc237319741 h 25 HYPERLINK l _Toc237319742 4.2. URL和路徑需求 PAGEREF _Toc237319742 h
8、 27 HYPERLINK l _Toc237319743 4.3. 使用C和C+以外的語(yǔ)言 PAGEREF _Toc237319743 h 27 HYPERLINK l _Toc237319744 4.4. 代碼樣例 PAGEREF _Toc237319744 h 28 HYPERLINK l _Toc237319745 4.4.1. 使用版本庫(kù)層 PAGEREF _Toc237319745 h 28 HYPERLINK l _Toc237319746 4.4.2. 使用Python處理版本庫(kù)層 PAGEREF _Toc237319746 h 35 HYPERLINK l _Toc23731
9、9747 4.4.3. 一個(gè)Python狀態(tài)爬蟲(chóng) PAGEREF _Toc237319747 h 40 HYPERLINK l _Toc237319748 4.5. 參考資料 PAGEREF _Toc237319748 h 45引言目的為了對(duì)配置管理工具(Subversion,以下簡(jiǎn)稱(chēng)為SVN)應(yīng)用過(guò)程提供指導(dǎo),編制此指南.范圍本標(biāo)準(zhǔn)適應(yīng)于北京高偉達(dá)軟件技術(shù)內(nèi)部使用SVN根底知識(shí)SVN簡(jiǎn)介SVN 是一具開(kāi)源的版本控制系統(tǒng),SVN 將文件存放在中心版本庫(kù)里,這個(gè)版本庫(kù)很像一個(gè)普通的文件效勞器,不同的是,它可以記錄每一次文件和的修改情況。這樣我們就可以籍此將數(shù)據(jù)回復(fù)到以前的版本,并可以查看的更改細(xì)
10、節(jié)。也就是說(shuō),一旦一個(gè)文件被傳到SVN 上面,那么不管對(duì)它進(jìn)行什么操作,SVN 都會(huì)有清晰的記錄,即使它在N 天前被刪除了,也可以被找回來(lái)。所以,許多人將版本控制系統(tǒng)當(dāng)作一種神奇的“時(shí)間機(jī)器。SVN特性版本化目錄SVN 實(shí)現(xiàn)的“虛擬版本化文件系統(tǒng)可以跟蹤目錄樹(shù)的變更。也就是說(shuō),在SVN 中,文件和目錄都是版本化的。真實(shí)的版本歷史由于實(shí)現(xiàn)了文件和目錄的版本化,SVN 可以記錄如文件拷貝和改名這些常見(jiàn)操作帶來(lái)的版本變更,即在SVN 中,對(duì)文件或目錄都可以進(jìn)行增加、拷貝和操作,并有版本歷史記錄。原子提交一系列相關(guān)的更改,要么全部提交到版本庫(kù),要么一個(gè)也不提交,這樣用戶(hù)就可以將相關(guān)的更改組成一個(gè)邏輯整
11、體,防止出現(xiàn)局部修改需另一局部未修改的情況提交到版本庫(kù)中。可選的網(wǎng)絡(luò)層SVN 在版本庫(kù)訪問(wèn)的實(shí)現(xiàn)上具有較高的抽象程度,利于人們實(shí)現(xiàn)新的網(wǎng)絡(luò)訪問(wèn)機(jī)制。SVN 可以作為一個(gè)擴(kuò)展模塊嵌入到Apache 之中,這種方式在穩(wěn)定性和交互性方面有很大的優(yōu)勢(shì),可以直接使用效勞器的成熟技術(shù)認(rèn)證、授權(quán)和傳輸壓縮等。此外,SVN 自身也實(shí)現(xiàn)了一個(gè)輕型的、可獨(dú)立運(yùn)行的效勞器軟件。這個(gè)效勞器使用了一個(gè)特定的協(xié)議,這個(gè)協(xié)議可以輕松用SSH 封裝。我們目前選用的是SVN 自身的效勞器,即Svnserver 方式,本文主要是對(duì)Svnserver 方式的使用方法介紹。一致的數(shù)據(jù)操作SVN 用一個(gè)二進(jìn)制差算法描述文件和變化,對(duì)于
12、文件可讀和二進(jìn)行制不可讀文件其操作方式是一致的。這兩種類(lèi)型的文件壓縮存儲(chǔ)在版本庫(kù)中,而差異信息那么在網(wǎng)絡(luò)上雙向傳遞。高效的分支和標(biāo)簽操作在 SVN 中,分支與標(biāo)簽操作的開(kāi)銷(xiāo)與工程的大小無(wú)關(guān),SVN 的分支和標(biāo)簽操作是一種類(lèi)似于硬鏈接的機(jī)制拷貝整個(gè)工程。因而這些操作通常只會(huì)花費(fèi)很少且相對(duì)固定的時(shí)間??尚薷男許VN 沒(méi)有歷史負(fù)擔(dān),它以一系列優(yōu)質(zhì)的共享C 程序庫(kù)的方式實(shí)現(xiàn),具有定義良好的API。SVN的架構(gòu)SVN的根本應(yīng)用客戶(hù)端的安裝點(diǎn)擊Yes,重啟電腦,完成安裝。版本庫(kù)瀏覽 Repo-browser完成安裝之后,點(diǎn)擊鼠標(biāo)右鍵,會(huì)出現(xiàn)以下圖,這是SVN的根本功能,下面一一介紹.點(diǎn)擊Repo-brow
13、ser之后,會(huì)出現(xiàn)下面的小對(duì)話框:在里面輸入你要鍵接的版本庫(kù):輸入方法為: s:/效勞器IP:端口號(hào)/所在版本庫(kù)名稱(chēng),如PQA的配置庫(kù)為: s:/.8:8443/PQA記得svn 是小寫(xiě)字母的,點(diǎn)“OK進(jìn)入登錄界面。如果以前有登錄過(guò),SVN 會(huì)自動(dòng)記錄登錄歷史。登錄界面如下:輸入用戶(hù)名和密碼即可進(jìn)入所在的版本庫(kù)。版本庫(kù)的根本操作Add filefolder添加文件(文件夾)用此命令可以向效勞器端目錄添加一個(gè)本地的文件或文件夾。commit 提交使用commit命令可以將add的文件添加到效勞器Show log 查看日志點(diǎn)擊此按扭,會(huì)顯示當(dāng)前目錄下的所有文件和目錄日志的信息。會(huì)跳出下面的對(duì)話框:
14、Export 導(dǎo)出用此命令,指定路徑,便可導(dǎo)出一個(gè)干凈的目錄樹(shù),所謂“干凈的就是導(dǎo)出的文件不受SVN 的版本控制。默認(rèn)的是導(dǎo)出當(dāng)前版本的目錄內(nèi)容,當(dāng)然也可以指定你想導(dǎo)出的版,如以下圖:在Export directory中選擇本地的路徑.Revision graph 版本樹(shù)顯示 它可以把對(duì)此目錄所做的所有操作以圖的形式顯示出來(lái),并可以記錄每一步都進(jìn)行了什么操作,相當(dāng)于“Show log的一個(gè)圖解,如以下圖所示:Check out 檢出用此命令可以從效勞器導(dǎo)出選中的目錄到本地工作拷貝本機(jī),它和Export 的區(qū)別在于,檢出的文件受版本控制,如以下圖所示:Refresh 刷新刷新效勞器端目錄。Del
15、ete 刪除對(duì)目錄或文件都可以進(jìn)行刪除操作,刪除后版本號(hào)增加,可以通過(guò)“show log找出已經(jīng)刪除的文件,并且可以看到文件夾變成:注意:文件只有在自己的工作副本中刪除了,必須執(zhí)行commit,文件才算是真正的刪除了。Rename 對(duì)目錄或文件進(jìn)行改名如果要對(duì)文件進(jìn)行改名,要在效勞器端對(duì)文件或文件夾用Rename 命令,改完后在本地工作拷貝的上級(jí)目錄執(zhí)行“Commit即可??梢栽诒镜赜糜益I,使用TSVN 的菜單改名,提交后效果一樣。Copy to working copy 把當(dāng)前目錄拷貝到本地本地工作拷貝必須是已經(jīng)受版本控制的文件夾,執(zhí)行此命令后,如:把“01 參考資料復(fù)制到本地工作拷貝的“P
16、QA中,就會(huì)出現(xiàn)以下圖,綠色的對(duì)號(hào)表示此目錄是從效勞器上“Checkout出來(lái)的受版本控制的本地工作拷貝,藍(lán)色的加號(hào)表示此文件預(yù)添加到效勞器上。這時(shí),在此目錄空白處或選中“01參考資料文件夾,右鍵執(zhí)行“SVN Commit命令如以下圖所示:“01參考資料便會(huì)成功提交到效勞器上“PQA的目錄下面。Copy to 拷貝到用此命令可以在當(dāng)前版本庫(kù)中建立分支標(biāo)簽/基線,SVN 允許并行的維護(hù)文件和目錄的分支,各個(gè)分支間互相聯(lián)系,也可以從一個(gè)分支復(fù)制修改到另一個(gè)分支,最終,可以讓本地工作拷貝反映到不同的分支上,所以在日常的工作中,可以“混合和比較不同的開(kāi)發(fā)線。客戶(hù)端操作客戶(hù)端的根本操作在本地工作拷貝空白
17、處點(diǎn)擊右鍵會(huì)出現(xiàn)如以下圖所示,下面對(duì)此菜單中常用的功能做詳細(xì)的介紹.工作拷貝就是執(zhí)行“checkout命令從效勞器端檢出到本地的一個(gè)目錄,是個(gè)人的一個(gè)私有工作區(qū),在此目錄下,可以任意的編輯文件,如果是源代碼文件,可以像平常一樣編譯。比方,我們對(duì)過(guò)程記錄中會(huì)議記錄中一個(gè)文件的日期做修改,被編輯后的文件和它的上一級(jí)目錄都會(huì)顯示為:這時(shí)可以對(duì)此文件執(zhí)行 SVN Commit 提交操作,那么編輯的內(nèi)容便會(huì)提交到效勞器上,以便大家共享你的工作成果。這時(shí)對(duì)改后的版本點(diǎn)擊右鍵,執(zhí)行“Show log后,可以顯示版本日志,如果想看到本次的改動(dòng)和原始的版本有何差異,那么選中當(dāng)前版本記錄,右鍵執(zhí)行“show ch
18、anges如以下圖所示:這時(shí)它就會(huì)顯示本次是哪些動(dòng)作導(dǎo)致了版本的變化,紅色局部新增加的內(nèi)容,它以標(biāo)注的方式顯示:還要補(bǔ)充說(shuō)明的是,在SVN 上,有三種權(quán)限:讀、讀寫(xiě)、無(wú)權(quán)限。如果想對(duì)你的工作拷貝進(jìn)行編輯,那么你必須有在這個(gè)目錄下讀寫(xiě)的權(quán)限,如果在效勞器端此目錄下面你無(wú)權(quán)限或只有讀的權(quán)限,那么即使在本地拷貝做了修改,也不能提交到效勞器上,也就是說(shuō),每個(gè)有讀權(quán)限的人可以看查版本庫(kù)目錄下的內(nèi)容無(wú)權(quán)限的不能查看,但只能對(duì)自己被賦予讀寫(xiě)權(quán)限的目錄做修改。這就保護(hù)了你的工作目錄不會(huì)被別的人隨意改動(dòng)。常用功能介紹Revert 返回上一級(jí)如果你對(duì)文件做了修改之后,還未進(jìn)行提交,可是文檔的標(biāo)記已經(jīng)為紅色的嘆號(hào),
19、而這時(shí)你又發(fā)現(xiàn)變錯(cuò)了,想把文檔返回到原來(lái)的狀態(tài),這時(shí)你可以執(zhí)行Revert 操作,便可使文檔回到原來(lái)的狀態(tài),因?yàn)槟銢](méi)有執(zhí)行提交操作,這時(shí)效勞器上版本庫(kù)版本號(hào)不會(huì)增加。Update to revision 返回到版本如果是你已經(jīng)執(zhí)行了提交操作,這時(shí)可以用Update to revision 命令,在跳出的對(duì)話框中選擇你想返回到的版本,那么你的本地工作拷貝便會(huì)回到你所選的版本的狀態(tài)。“Save revision to也可以把原來(lái)版本進(jìn)行存檔。強(qiáng)調(diào)一點(diǎn)的是,你的本地工作拷貝可以返回到原來(lái)的版本,可是效勞器上只會(huì)記錄你對(duì)它進(jìn)行最后一次提交的版本,所以效勞器端版本不會(huì)變化,如果你想把效勞器端的文檔內(nèi)容也
20、換為原來(lái)的狀態(tài),可以用舊版本文件覆蓋新版本文件,然后提交。Import 導(dǎo)入導(dǎo)入是一種批量向效勞器上添加文件的方法,如果你想把本地的文件或文件夾添加到效勞器上的某個(gè)目錄下面,那么在本地的目錄中,在空白處右鍵TortoisrSVNImport,會(huì)跳出下面的對(duì)話框:點(diǎn)“OK后就可以把本地的文件或文件夾導(dǎo)入到效勞器端所選目錄下面。SVN Update 更新用此命令可以更新你的工作拷貝,因?yàn)槊總€(gè)人都有自己的工作拷貝,在你對(duì)工程目錄進(jìn)行操作的同時(shí),工程組其他人員也在進(jìn)行編輯并提交的動(dòng)作,版本庫(kù)內(nèi)容隨著工程人員的每一次提交做著不同的變化,所以在每次編輯操作之前,都要對(duì)本地工作拷貝執(zhí)行Update 的操作,
21、以保證本地工作拷貝與效勞器工程版本庫(kù)內(nèi)容保持一致。Resolved 沖突已解決當(dāng)兩個(gè)人同時(shí)編輯一個(gè)文件,一個(gè)人先提交后,另一個(gè)人再進(jìn)行提交的時(shí)候就會(huì)出現(xiàn)沖突,這時(shí)會(huì)彈出沖突對(duì)話框,如以下圖所示:你可以對(duì)出現(xiàn)的沖突的文件進(jìn)行編輯,選定你最終想要的文檔。這就是“Merge合并操作。在出現(xiàn)沖突以及應(yīng)用分支時(shí)會(huì)經(jīng)常用到合并的功能。合并完畢后,執(zhí)行 Resolved,那么新的版本就被生成了。Switch 切換把你的工作拷貝切換到另個(gè)的URL效勞器目錄,效勞器端目錄有所變化,所存儲(chǔ)的文件位置發(fā)生了變化,那么對(duì)你的工作拷貝進(jìn)行編輯后就會(huì)出現(xiàn)提交不上去的情況,這時(shí)就要執(zhí)行Switch 操作,使你的工作拷貝切換
22、到效勞器端對(duì)應(yīng)的目錄下面,即可再進(jìn)行提交。Switch 操作只限于版本庫(kù)內(nèi)的切換。Relocate 重新定位它和Switch 的功能是一樣的,不同的是,它實(shí)現(xiàn)的是版本庫(kù)與版本庫(kù)之間的切換。當(dāng)效勞器地址或版本庫(kù)名稱(chēng)發(fā)生變化時(shí),可以用些命令來(lái)更新你的工作拷貝。CreateApply patch 創(chuàng)立應(yīng)用補(bǔ)丁如果你對(duì)這個(gè)文件沒(méi)有修改的權(quán)限,但是迫于形勢(shì),你又必須對(duì)這個(gè)文件進(jìn)行修改,這時(shí)你就可以用Create patch 創(chuàng)立補(bǔ)丁,然后把你創(chuàng)立的補(bǔ)丁發(fā)給對(duì)此目錄有寫(xiě)權(quán)限的工作人員,他執(zhí)行Apply patch后,你所做的修改就會(huì)被提交到效勞器上。分支與合并從工程主分支下載工程初始源碼到開(kāi)發(fā)分支操作步驟
23、:在trunk目錄新建一個(gè)工程名稱(chēng)為Astx;在Astx工程中新建兩個(gè)模塊分別為module1和module2,分別為新建一個(gè)名 test.txt的文件;選擇Astx工程名稱(chēng),右擊選擇branch/tag;請(qǐng)注意 From WC at URL必須是工程Astx的根路徑,To URL:在這里選擇branch 存放的路徑,通常的路徑為: :/localhost/svn/Astx/branches/astx_dev_tb; 注:Branches為分支的存放路徑,astx_dev_tb為分支的名稱(chēng)在branches 目錄右擊update,就可以看到剛剛的astx_dev_tb分支;把分支(astx_d
24、ev_tb)的的修改合并到工程主分支操作步驟:選擇工程主分支右擊TortoiseSVN選擇 merge,選擇 Reintegrate a branch;點(diǎn)擊Next,在URL to merge from 的地址欄中選擇astx_dev_tb分支的路徑; 注意Working copy是工程主分支的路徑;點(diǎn)擊NEXT,在Merge depth 下拉框中選擇 “working copy,點(diǎn)擊Merge, 將分支的修改合并到主干上;在工程主分支右擊commit,整個(gè)的過(guò)程才算完成!如果要退回前一個(gè)版本,選擇工程主分支右擊TortoiseSVN選擇Revert,將取消本 次合并的內(nèi)容.兩個(gè)不同分支的修改
25、合并到工程主分支修改同一個(gè)文件的不同行操作步驟:基于工程主分支創(chuàng)立兩個(gè)不同的分支分別為:astx_dev_john,astx_dev_harry(創(chuàng)立分支的方法,請(qǐng)參照1.1);注: john和harry 為同一個(gè)工程創(chuàng)立自己的工作副本,工作是并行的.john和harry修改同一個(gè)文件text.txt的不同行,john先保存修改到版本庫(kù)(具體 的合并的步驟,請(qǐng)參照1.2),最后別忘了commit!當(dāng)harry提交修改的時(shí)候,版本庫(kù)提示文件text.txt在他上次更新之后已經(jīng)更改了, 如果john修改的內(nèi)容不和harry的沖突,一旦把所有的修改集成到一起,就可以把工作拷貝保存到版本庫(kù),最后別忘了
26、commit! 修改同一個(gè)文件的同一行操作步驟:基于工程主分支創(chuàng)立兩個(gè)不同的分支分別為:astx_dev_john,astx_dev_harry;注: john和harry 為同一個(gè)工程創(chuàng)立自己的工作副本,工作是并行的.john和harry修改同一個(gè)文件text.txt的同一行,john先保存修改到版本庫(kù)(具體的合并的步驟,請(qǐng)參照1.2);當(dāng)harry提交修改的時(shí)候,版本庫(kù)提示文件text.txt沖突,這時(shí)只能夠人工去選擇一組修改,并把所有的修改集成到一起,就可以把工作拷貝保存到版本庫(kù),記得做完之后一定要commit!SVN API使用API使用Subversion庫(kù)API開(kāi)發(fā)應(yīng)用看起來(lái)相當(dāng)?shù)?/p>
27、直接,所有的公共頭文件放在源文件的subversion/include目錄,從源代碼編譯和安裝Subversion本身,需要這些頭文件拷貝到系統(tǒng)位置。這些頭文件包括了所有用戶(hù)和Subversion庫(kù)可以訪問(wèn)的功能和類(lèi)型。Subversion開(kāi)發(fā)者社區(qū)仔細(xì)確實(shí)保所有的公共API有完好的文檔直接引用頭文件的文檔。你首先應(yīng)該注意Subversion的數(shù)據(jù)類(lèi)型和方法是命名空間保護(hù)的,每一個(gè)公共Subversion對(duì)象名以svn_開(kāi)頭,然后緊跟一個(gè)這個(gè)對(duì)象定義如wc、client和fs等等所在的庫(kù)的簡(jiǎn)短編碼,然后是一個(gè)下劃線_和后面的對(duì)象名稱(chēng)。半公開(kāi)的方法庫(kù)使用,但是但庫(kù)之外代碼不可以使用并且只可以在庫(kù)
28、自己的目錄看到與這個(gè)命名模式不同,并不是庫(kù)代碼之后緊跟一個(gè)下劃線,他們是用兩個(gè)下劃線_。給定源文件的私有方法沒(méi)有特殊前綴,使用static聲明。當(dāng)然,一個(gè)編譯器不會(huì)關(guān)心命名習(xí)慣,只是用來(lái)區(qū)分給定方法或數(shù)據(jù)類(lèi)型的應(yīng)用范圍。關(guān)于Subversion的API編程的另一個(gè)好的資源是hacking指南,可以在找到,這個(gè)文檔包含了有用的信息,同時(shí)滿(mǎn)足Subversion本身的開(kāi)發(fā)者和將Subversion作為第三方庫(kù)的開(kāi)發(fā)者。Apache 可移值運(yùn)行庫(kù)伴隨Subversion自己的數(shù)據(jù)類(lèi)型,你會(huì)看到許多apr開(kāi)頭的數(shù)據(jù)類(lèi)型引用來(lái)自Apache可移植運(yùn)行庫(kù)APR的對(duì)象。APR是Apache可移植運(yùn)行庫(kù),源自
29、為了效勞器代碼的多平臺(tái)性,嘗試將不同的操作系統(tǒng)特定字節(jié)與操作系統(tǒng)無(wú)關(guān)代碼隔離。結(jié)果就提供了一個(gè)根底API的庫(kù),只有一些適度區(qū)別或者是廣泛的來(lái)自各個(gè)操作系統(tǒng)。Apache 效勞器很明顯是APR庫(kù)的第一個(gè)用戶(hù),Subversion開(kāi)發(fā)者立刻發(fā)現(xiàn)了使用APR庫(kù)的價(jià)值。意味著Subversion沒(méi)有操作系統(tǒng)特定的代碼,也意味著Subversion客戶(hù)端可以在Server存在的平臺(tái)編譯和運(yùn)行。當(dāng)前這個(gè)列表包括,各種類(lèi)型的Unix、Win32、OS/2和Mac OS X。除了提供了跨平臺(tái)一致的系統(tǒng)調(diào)用, APR給Subversion對(duì)多種數(shù)據(jù)類(lèi)型有快速的訪問(wèn),如動(dòng)態(tài)數(shù)組和哈希表。Subversion在代碼
30、中廣泛使用這些類(lèi)型,但是Subversion的API原型中最常見(jiàn)的APR類(lèi)型是apr_pool_tAPR內(nèi)存池,Subversion使用內(nèi)部緩沖池用來(lái)進(jìn)行內(nèi)存分配除非外部庫(kù)在API傳遞參數(shù)時(shí)需要一個(gè)不同的內(nèi)存管理模式,而且一個(gè)人如果針對(duì)Subversion的API編碼不需要做同樣的事情,他們可以在需要時(shí)給API提供緩沖池,這意味著Subversion的API使用者也必須鏈接到APR,必須調(diào)用apr_initialize()來(lái)初始化APR子系統(tǒng),而且在使用Subversion API時(shí)必須創(chuàng)立和管理池,通常是使用svn_pool_create()、svn_pool_clear()和svn_poo
31、l_destroy()。使用內(nèi)存池編程幾乎每一個(gè)使用過(guò)C語(yǔ)言的開(kāi)發(fā)者曾經(jīng)感慨令人畏縮的內(nèi)存管理,分配足夠的內(nèi)存,并且追蹤內(nèi)存的分配,在不需要時(shí)釋放內(nèi)存這個(gè)任務(wù)會(huì)非常復(fù)雜。當(dāng)然,如果沒(méi)有正確地做到這一點(diǎn)會(huì)導(dǎo)致程序毀掉自己,或者更加嚴(yán)重一點(diǎn),把電腦搞癱。另一方面高級(jí)語(yǔ)言使開(kāi)發(fā)者完全擺脫了內(nèi)存管理, HYPERLINK :/ /svnbook/1.4/svn.developer.usingapi.html l ftn.d0e13397#ftn.d0e13397 53Java和Python之類(lèi)的語(yǔ)言使用垃圾收集原理,在需要的時(shí)候分配對(duì)象內(nèi)存,在不使用時(shí)進(jìn)行清理。APR提供
32、了一種叫做池根底的中等的內(nèi)存管理方法,允許開(kāi)發(fā)者以一種低分辨率的方式控制內(nèi)存每塊或池“pool的內(nèi)存,而不是每個(gè)對(duì)象。不是使用malloc()和其他按照對(duì)象分配內(nèi)存的方式,你要求APR從內(nèi)存創(chuàng)立一段內(nèi)存池,當(dāng)你結(jié)束使用在池中創(chuàng)立的對(duì)象,你銷(xiāo)毀池,可以有效地取消其中的對(duì)象消耗的內(nèi)存。通過(guò)池,你不需要跟蹤每個(gè)對(duì)象的內(nèi)存釋放,你的程序只需要跟蹤這些對(duì)象,將對(duì)象分配到池中,而池的生命周期池的創(chuàng)立和刪除之間的時(shí)間滿(mǎn)足所有對(duì)象的需要。URL和路徑需求因?yàn)榉植际桨姹究刂撇僮魇荢ubversion存在的重點(diǎn),有意義來(lái)關(guān)注一下國(guó)際化i18n支持。畢竟,當(dāng)“分布式或許意味著“橫跨辦公室,它也意味著“橫跨全球。為了
33、更容易一點(diǎn),Subversion的所有公共接口只接受路徑參數(shù),這些參數(shù)是傳統(tǒng)的,使用UTF-8編碼。這意味著,舉個(gè)例子,任何新的使用libsvn_client接口客戶(hù)端庫(kù),在把這些參數(shù)傳遞給Subversion庫(kù)前,需要首先將路徑從本地代碼轉(zhuǎn)化為UTF-8代碼,然后將Subversion傳遞回來(lái)的路徑轉(zhuǎn)換為本地代碼,很幸運(yùn),Subversion提供了一組任何程序可以使用的轉(zhuǎn)化方法見(jiàn)subversion/include/svn_utf.h。同樣,Subversion的API需要所有的URL參數(shù)是正確的URI編碼,所以,我們不會(huì)傳遞file:/home/username/My File.txt作為
34、My File.txt的URL,而要傳遞file:/home/username/My%20File.txt。再次,Subversion提供了一些你可以使用的助手方法svn_path_uri_encode()和svn_path_uri_decode(),分別用來(lái)URI的編碼和解碼。使用C和C+以外的語(yǔ)言除C語(yǔ)言以外,如果你對(duì)使用其他語(yǔ)言結(jié)合Subversion庫(kù)感興趣如Python腳本或是Java應(yīng)用Subversion通過(guò)簡(jiǎn)單包裹生成器SWIG提供了最初的支持。Subversion的SWIG綁定位于subversion/bindings/swig,并且慢慢的走向成熟進(jìn)入可用狀態(tài)。這個(gè)綁定允許你
35、直接調(diào)用Subversion的API方法,使用包裹器會(huì)把腳本數(shù)據(jù)類(lèi)型轉(zhuǎn)化為Subversion需要的C語(yǔ)言庫(kù)類(lèi)型。非常不幸,Subversion的語(yǔ)言綁定缺乏對(duì)核心Subversion模塊的關(guān)注,但是,花了很多力氣處理創(chuàng)立針對(duì)Python、Perl和Ruby的功能綁定,在一定程度上,在這些接口上的工作量可以在其他語(yǔ)言的SWIG包括C#、Guile、Java、MzScheme、OCaml、PHP、Tcl等等接口上得到重用。然而,為了完成復(fù)雜的API,一些SWIG接口仍然需要額外的編程工作,關(guān)于SWIG本身的更多信息可以看工程的網(wǎng)站 :/ /。Subversion也有Java的語(yǔ)言
36、綁定,JavaJL綁定位于Subversion源目錄樹(shù)的subversion/bindings/java不是基于SWIG的,而是javah和手寫(xiě)JNI的混合,JavaHL幾乎覆蓋Subversion客戶(hù)端的API,目標(biāo)是作為Java根底的Subversion客戶(hù)端和集成IDE的實(shí)現(xiàn)。Subversion的語(yǔ)言綁定缺乏Subversion核心模塊的關(guān)注,但是通常可以作為一個(gè)產(chǎn)品信賴(lài)。大量腳本、應(yīng)用、Subversion的GUI客戶(hù)端和其他第三方工具現(xiàn)在已經(jīng)成功地運(yùn)用了Subversion語(yǔ)言綁定來(lái)完成Subversion的集成。這里使用其它語(yǔ)言的方法來(lái)與Subversion交互沒(méi)有任何意義:Su
37、bversion開(kāi)發(fā)社區(qū)沒(méi)有提供其他的綁定,你可以在Subversion工程鏈接頁(yè)里找到其他綁定的鏈接,但是有一些流行的綁定我覺(jué)得應(yīng)該特別留意。首先是Python的流行綁定,Barry Scott的PySVN。PySVN鼓吹它們提供了更多Python樣式的接口,而不像Subversion自己的Python綁定的C樣式接口。對(duì)于希望尋求Subversion純Java實(shí)現(xiàn)的人,可以看看SVNKit :/svnkit /,也就是從頭使用Java編寫(xiě)的Subversion。你必須要小心,SVNKit沒(méi)有采用Subversion的核心庫(kù),其行為方式?jīng)]有確保與Subversion匹配。代碼樣例使用版本庫(kù)層
38、使用版本庫(kù)層中包含了一段C代碼C編寫(xiě)描述了我們討論的概念,它使用了版本庫(kù)和文件系統(tǒng)接口可以通過(guò)方法名svn_repos_和svn_fs_分辨創(chuàng)立了一個(gè)添加目錄的修訂版本。你可以看到APR庫(kù)的使用,為了內(nèi)存分配而傳遞,這些代碼也揭開(kāi)了一些關(guān)于Subversion錯(cuò)誤處理的晦澀事實(shí)所有的Subversion錯(cuò)誤必須需要明確的處理以防止內(nèi)存泄露在某些情況下,應(yīng)用失敗。/* Convert a Subversion error into a simple boolean error code. * * NOTE: Subversion errors must be cleared (using svn
39、_error_clear() * because they are allocated from the global pool, else memory * leaking occurs. */#define INT_ERR(expr) do svn_error_t *_temperr = (expr); if (_temperr) svn_error_clear(_temperr); return 1; return 0; while (0)/* Create a new directory at the path NEW_DIRECTORY in the Subversion * rep
40、ository located at REPOS_PATH. Perform all memory allocation in * POOL. This function will create a new revision for the addition of * NEW_DIRECTORY. Return zero if the operation completes * successfully, non-zero otherwise. */static intmake_new_directory(const char *repos_path, const char *new_dire
41、ctory, apr_pool_t *pool) svn_error_t *err; svn_repos_t *repos; svn_fs_t *fs; svn_revnum_t youngest_rev; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; const char *conflict_str; /* Open the repository located at REPOS_PATH. */ INT_ERR(svn_repos_open(&repos, repos_path, pool); /* Get a pointer to the fil
42、esystem object that is stored in REPOS. */ fs = svn_repos_fs(repos); /* Ask the filesystem to tell us the youngest revision that * currently exists. */ INT_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool); /* Begin a new transaction that is based on YOUNGEST_REV. We are * less likely to have our lat
43、er commit rejected as conflicting if we * always try to make our changes against a copy of the latest snapshot * of the filesystem tree. */ INT_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool); /* Now that we have started a new Subversion transaction, get a root * object that represents that trans
44、action. */ INT_ERR(svn_fs_txn_root(&txn_root, txn, pool); /* Create our new directory under the transaction root, at the path * NEW_DIRECTORY. */ INT_ERR(svn_fs_make_dir(txn_root, new_directory, pool); /* Commit the transaction, creating a new revision of the filesystem * which includes our added di
45、rectory path. */ err = svn_repos_fs_commit_txn(&conflict_str, repos, &youngest_rev, txn, pool); if (! err) /* No error? Excellent! Print a brief report of our success. */ printf(Directory %s was successfully added as new revision %ld.n, new_directory, youngest_rev); else if (err-apr_err = SVN_ERR_FS
46、_CONFLICT) /* Uh-oh. Our commit failed as the result of a conflict * (someone else seems to have made changes to the same area * of the filesystem that we tried to modify). Print an error * message. */ printf(A conflict occurred at path %s while attempting to add directory %s to the repository at %s
47、.n, conflict_str, new_directory, repos_path); else /* Some other error has occurred. Print an error message. */ printf(An error occurred while attempting to add directory %s to the repository at %s.n, new_directory, repos_path); INT_ERR(err); 使用Python處理版本庫(kù)層同樣的C程序需要處理APR內(nèi)存池系統(tǒng),但是Python自己處理內(nèi)存,Subversio
48、n的Python綁定也遵循這種習(xí)慣。在C語(yǔ)言中,為表示路徑和條目的hash需要處理自定義的數(shù)據(jù)類(lèi)型例如APR提供的庫(kù),但是Python有hash叫做“dictionaries,并且是內(nèi)置數(shù)據(jù)類(lèi)型,而且還提供了一系列操作這些類(lèi)型的函數(shù),所以SWIG通過(guò)Subversion的語(yǔ)言綁定層的自定義幫助要小心的將這些自定義數(shù)據(jù)類(lèi)型映射到目標(biāo)語(yǔ)言的數(shù)據(jù)類(lèi)型,這為目標(biāo)語(yǔ)言的用戶(hù)提供了一個(gè)更加直觀的接口。#!/usr/bin/pythonCrawl a repository, printing versioned object path names.import sysimport os.pathimport
49、 svn.fs, svn.core, svn.reposdef crawl_filesystem_dir(root, directory): Recursively crawl DIRECTORY under ROOT in the filesystem, and return a list of all the paths at or below DIRECTORY. # Print the name of this path. print directory + / # Get the directory entries for DIRECTORY. entries = svn.fs.sv
50、n_fs_dir_entries(root, directory) # Loop over the entries. names = entries.keys() for name in names: # Calculate the entrys full path. full_path = directory + / + name # If the entry is a directory, recurse. The recursion will return # a list with the entry and all its children, which we will add to
51、 # our running list of paths. if svn.fs.svn_fs_is_dir(root, full_path): crawl_filesystem_dir(root, full_path) else: # Else its a file, so print its path here. print full_pathdef crawl_youngest(repos_path): Open the repository at REPOS_PATH, and recursively crawl its youngest revision. # Open the rep
52、ository at REPOS_PATH, and get a reference to its # versioning filesystem. repos_obj = svn.repos.svn_repos_open(repos_path) fs_obj = svn.repos.svn_repos_fs(repos_obj) # Query the current youngest revision. youngest_rev = svn.fs.svn_fs_youngest_rev(fs_obj) # Open a root object representing the younge
53、st (HEAD) revision. root_obj = svn.fs.svn_fs_revision_root(fs_obj, youngest_rev) # Do the recursive crawl. crawl_filesystem_dir(root_obj, ) if _name_ = _main_: # Check for sane usage. if len(sys.argv) != 2: sys.stderr.write(Usage: %s REPOS_PATHn % (os.path.basename(sys.argv0) sys.exit(1) # Canonical
54、ize the repository path. repos_path = svn.core.svn_path_canonicalize(sys.argv1) # Do the real work. crawl_youngest(repos_path)一個(gè)Python狀態(tài)爬蟲(chóng)Subversion的Python綁定也可以用來(lái)進(jìn)行工作拷貝的操作,在本章前面的小節(jié)中,我們提到過(guò)libsvn_client接口,它存在的目的就是簡(jiǎn)化編寫(xiě)Subversion客戶(hù)端的難度, HYPERLINK :/ /svnbook/1.4/svn.developer.usingapi.htm
55、l l svn.developer.usingapi.otherlangs.ex-2 o 例8.3.一個(gè)Python狀態(tài)爬蟲(chóng) 例8.3 “一個(gè)Python狀態(tài)爬蟲(chóng)是一個(gè)例子,講的是如何使用SWIG綁定創(chuàng)立一個(gè)擴(kuò)展版本的svn status命令。#!/usr/bin/env pythonCrawl a working copy directory, printing status information.import sysimport os.pathimport getoptimport svn.core, svn.client, svn.wcdef generate_status_code(
56、status): Translate a status value into a single-character status code, using the same logic as the Subversion command-line client. code_map = svn.wc.svn_wc_status_none : , svn.wc.svn_wc_status_normal : , svn.wc.svn_wc_status_added : A, svn.wc.svn_wc_status_missing : !, svn.wc.svn_wc_status_incomplet
57、e : !, svn.wc.svn_wc_status_deleted : D, svn.wc.svn_wc_status_replaced : R, svn.wc.svn_wc_status_modified : M, svn.wc.svn_wc_status_merged : G, svn.wc.svn_wc_status_conflicted : C, svn.wc.svn_wc_status_obstructed : , svn.wc.svn_wc_status_ignored : I, svn.wc.svn_wc_status_external : X, svn.wc.svn_wc_status_unversioned : ?, return code_map.get(status, ?)def do_status(wc_path, verbose): # Calculate the length of the input worki
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度扶貧資金管理及使用專(zhuān)項(xiàng)合同3篇
- 2025年度智能廣告創(chuàng)意制作與推廣服務(wù)合同4篇
- 2024鋪位出租合同-親子樂(lè)園鋪位租賃管理協(xié)議3篇
- 2025年度石材加工與大理石施工一體化工程合同4篇
- 2025年度土地整治與修復(fù)項(xiàng)目租賃合同4篇
- 2025年度智能生產(chǎn)線承包運(yùn)營(yíng)服務(wù)合同4篇
- 2024版貨車(chē)租賃合規(guī)性及責(zé)任明確合同版B版
- 2025年度水電安裝工程智能化施工技術(shù)與保修服務(wù)合同3篇
- 2025年度智能物流配套廠房建設(shè)合同范本4篇
- 2025年度智能家居瓷磚批發(fā)代理銷(xiāo)售合同3篇
- 使用錯(cuò)誤評(píng)估報(bào)告(可用性工程)模版
- 公司章程(二個(gè)股東模板)
- GB/T 19889.7-2005聲學(xué)建筑和建筑構(gòu)件隔聲測(cè)量第7部分:樓板撞擊聲隔聲的現(xiàn)場(chǎng)測(cè)量
- 世界奧林匹克數(shù)學(xué)競(jìng)賽6年級(jí)試題
- 藥用植物學(xué)-課件
- 文化差異與跨文化交際課件(完整版)
- 國(guó)貨彩瞳美妝化消費(fèi)趨勢(shì)洞察報(bào)告
- 云南省就業(yè)創(chuàng)業(yè)失業(yè)登記申請(qǐng)表
- UL_標(biāo)準(zhǔn)(1026)家用電器中文版本
- 國(guó)網(wǎng)三個(gè)項(xiàng)目部標(biāo)準(zhǔn)化手冊(cè)(課堂PPT)
- 快速了解陌生行業(yè)的方法論及示例PPT課件
評(píng)論
0/150
提交評(píng)論