1. 程式人生 > >SVNKit學習——wiki+簡介(二)

SVNKit學習——wiki+簡介(二)

dea ssh 抽象 pan ide 控制 代理服務器 目錄 列操作

 這篇文章是參考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+簡介(二)