SVNKit學習——wiki+簡介(二)
這篇文章是參考SVNKit官網在wiki的文檔,做了個人的理解~
首先拋出一個疑問,Subversion是做什麽的,SVNKit又是用來幹什麽的?
相信一般工作過的同學都用過或了解過svn,不了解的同學可以到官網看下,這裏不作為本文重點。
需要理解的概念:
倉庫(Repository):是一個特殊的結構,記錄文件版本管理的狀態。
工作副本(Working Copy):本地從倉庫檢出的文件。
修訂版(Revision):用於記錄倉庫數據的變更狀態,初始化版本為0,每執行一次操作版本號+1,每執行一次都會生成一個快照。
SVN目錄結構:
每次進行提交等操作,svn並非記錄所有文件的內容,而是比較智能的只記錄和上一個版本不同的文件、目錄。
所以,如果你刪除了某一個文件,並非完整的刪除掉了,因為你在歷史的修訂版本中還是可以看到的。
使用方式:
1.利用一個svn客戶端程序,比如命令行、TortoiseSVN、VisualSVN Server、各種IDE插件(Eclipse的Subclipse、Intellij IDEA的TMATE)
2.利用特殊的客戶端類庫,比如SVNKit就是一個純java操作SVN的程序
集中管理不同的應用大約可以分為以下兩種模式:
1.適用於使用Working Copy管理的程序,程序通常以文件、目錄等方式存在。
2.不適用於Working Copy管理的程序,這裏比較抽象一些,區別於文件、目錄。但是這類文件的版本控制也是非常重要的。這種類型的程序使用Subversion Repository管理,保持其抽象的模型層次。
建立一個Subversion倉庫
參考我的另一篇博客:http://www.cnblogs.com/douJiangYouTiao888/p/6116121.html
SVNKit的結構是什麽樣子的?
通過上圖我們可以比較明顯的看出,主要包含兩種操作方式:
①.High-Level API:針對Working Copy的一系列操作,底層實現實際調用Low-Level API。封裝了多個SVN*Client,不同的操作基於不同的SVN*Client,操作方法和參數與SVN客戶端命令行比較相似。
②.Low-Level API:針對Subversion Repository的操作,相當於操作Repository的中間驅動,它知道如何與底層協議進行交互(實際上這層API實現了底層協議)。這一層對數據結構進行了分層,表現為一個包含版本控制的、抽象復雜的樹結構。
SVNKit訪問Repository所支持的協議:
遠程協議:
①.svn://協議(或svn+xxx,最常用的是svn+ssh)
②.http://協議(或https://協議)
本地協議:
①.file:///協議,只支持FSFS類型的Repository
開始使用SVNKit
從官網下載好SVNKit的二進制安裝包後,第一步應該做什麽?
High-Level API:主要使用SVNClientManager類來創建一些了的SVN*Client實現一系列對Working Copy的操作,比如創建一個SVNUpdateClient,可以執行checkout、update、switch、export等。
Low-Level API:主要使用SVNRepository類與Repository倉庫進行交互,支持的協議都是基於SVNRepositoryFactory抽象類的具體實現,協議和實現類的關系:
protocol SVNRepositoryFactory realization svn:// SVNRepositoryFactoryImpl http:// DAVRepositoryFactory file:/// FSRepositoryFactory
使用High-Level API的操作步驟:
1.根據不同協議,初始化不同的倉庫工廠。(工廠實現基於SVNRepositoryFactory抽象類)
//svn://, svn+xxx:// (svn+ssh:// in particular) SVNRepositoryFactoryImpl.setup(); //http:// and https:// DAVRepositoryFactory.setup(); //file:/// FSRepositoryFactory.setup();
2.創建一個驅動。(基於工廠),svnkit中repository所有的URL都基於SVNURL類生成,編碼不是UTF-8的話,可以調用SVNURL的parseURIEncoded()方法。url可以是項目根目錄、目錄或文件。
SVNURL url = SVNURL.parseURIDecoded( "svn://host/path_to_repository_root/inner_path" ); SVNRepository repository = SVNRepositoryFactory.create( url, null );
這裏的URL有兩種表現形式:(此處不好理解,下一篇文章會使用具體代碼做解釋)
①.不是以"/"開頭,相對於驅動的綁定位置,即Repository的目錄
②.以"/"開頭,代表repository的根,相對於Repository的Root對應的目錄
3.創建一個權限驗證對象
SVN大多數操作都是具有權限訪問控制的,大多數情況不支持匿名訪問。
SVNKit使用ISVNAuthenticationManager接口來實現權限的控制。
ISVNAuthenticationManager authManager; ... SVNURL url = SVNURL.parseURIEncoded( "svn://host/path_to_repository_root/inner_path" ); SVNRepository repository = SVNRepositoryFactory.create( url , null ); //set an auth manager which will provide user credentials repository.setAuthenticationManager(basicAuthManager); ...
權限管理基於以下四個邏輯塊:
不同類型的身份驗證憑據:(要依據實際類型創建)
Kind Class representation Field of usage PASSWORD SVNPasswordAuthentication login:password authentication (svn://, http://) SSH SVNSSHAuthentication In svn+ssh:// tunneled connections SSL SVNSSLAuthentication In secure https:// connections USERNAME SVNUserNameAuthentication With file:/// protocol, on local machines
身份驗證交互示意圖(圖1首次、圖2非首次):身份驗證首次需要用戶輸入,後續則無需重復輸入:
圖1:
圖2:
代理:如果authentication manager提供了一個非空的proxy manager,SVNKit將通過代理服務器代理管理目標服務器。
SSL:支持SSL管理
ISVNAuthenticationManager的默認實現:
①.BasicAuthenticationManager:
1.無需磁盤授權存儲。
2.無需提供SSL provider
3.無需服務器或者文件配置。
4.使用proxy、ssh setting、user credentials provoded到類的構造器中,無需身份驗證提供者。
5.不緩存credentials 。
②.DefaultSVNAuthenticationManager:
1.可以使用磁盤一個授權存儲於默認Subversion運行的配置或者指定的目錄。可以在目錄中緩存credentials。
2.使用運行時的內存存儲credentials。
3.可以使用用戶提供的username/password認證用戶。
4.使用SSL、SSH、Proxy setting、服務器配置文件運行Subvesion。
強制認證方案:
盡管Subversion的優勢是你不需要重復驗證直到服務器要求驗證。有時它可能是有效有能力讓svnkit立即驗證用戶不浪費時間。ISVNAuthenticationManager接口提供了這個能力,它在SVNKit使用一個行為控制時返回一個標識。
HTTP認證的方案:
①.Basic
②.Digest
③.NTLM
Basic、Digest兩種方案,你需要提供一個用戶名和密碼:
ISVNAuthenticationManager authManager = new BasicAuthenticationManager( "login" , "password" );
NTLM方案,你需要提供一個主域名:
ISVNAuthenticationManager authManager = new BasicAuthenticationManager( "DOMAIN\\login" , "password" );
SVNKit學習——wiki+簡介(二)