歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 通過 JGit 訪問 Git 倉庫

通過 JGit 訪問 Git 倉庫

日期:2017/2/28 14:27:26   编辑:Linux教程

一個Git庫倉在 JGit裡面表現為Repository類,該類可以看作是這個庫的句柄。通過Repository類實例,你可以創建JGit命令以及可以控制配置、參數等。

獲取Git庫倉的引用有很多種方法,看到很多人在這方面有困難,本文總結了如何通過JGit來訪問Git庫倉來幫助大家。

存儲庫和建造者

Repository類是抽象的,允許實現不同的存儲後端。 舉例來說,有一個InMemoryRepository類作為測試和實驗。當然,最常用的是FileRepository,它表示的是一個本地文件系統。因為實際的實現被考慮為內置的,每一個Repository的實現都有一個相應的存儲庫建造者,他們應該被用於在內部創建實例。

因此FileRepositoryBuilder是一種被推薦的方式,用這種方式創建了一個FileRepository。由於歷史原因,另外還有一個RepositoryBuilder,它是完全一樣的,但是在下一個大版本升級之後將會被移除。

為了你的需要,一旦你已經配置了一個存儲庫構建器,調用它的build()方法來創建一個存儲庫。

FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
repositoryBuilder.setMustExist( true );
repositoryBuilder.setGitDir( ... );
Repository repository = repositoryBuilder.build();

布局的原因,我在每行放置了一個方法調用,但是FileRepositoryBuilder還是一個流接口的實現,所以這個方法調用能夠被鏈接。

這裡討論的所有方法只能應用於本地存儲庫。Git是一個分布式的版本控制系統,因此不是為了直接操作遠程庫設計。

為了操作遠程庫,首先你不得不克隆它。現在你可以在本地副本做些修改,例如提交新的或修改的文件,創建分支或標簽等等。為了向遠程庫同步你的變更,你首先不得不從遠程庫集成(即獲取)變更(如果有的話),然後最終推送你本地的變更。

推薦 setGitDir()

在JGit中,一個基於文件的存儲庫是通過一個目錄被識別的。然而,識別一個存儲庫的兩個目錄在合適條件下可能出現:當前檢出的版本屬於工作目錄並且git目錄保存著對象數據庫和元數據(如分支,標簽等等)。

盡管FileRepositoryBuilder有setGitDir()方法和setWorkTree()方法,我推薦始終使用setGitDir()方法,因為:

  • 默認情況下,git目錄是工作目錄的一個直接子目錄,但是這個可以通過一個環境變量或一個配置設置被覆蓋。

  • 並且裸存儲庫根本就沒有工作目錄。

這是一個存儲庫嗎?

FileRepositoryBuilder的build()方法不論一個存儲庫是否存在都會返回一個Repository。即使所給的目錄不存在,一個實例也被返回了。

我發現有兩種方式測試是否所給的目錄真實的指向一個存在的存儲庫。通過調研setMustExist(true)方法,FileRepositoryBuilder 能被配置,只用來構建存在的存儲庫。一旦must-exist標記被打開,如果沒有找到存儲庫,build()方法將拋出一個RepositoryNotFoundException 異常。值得一提的是,這種行為沒有正式文檔說明。這可能是JavaDoc中的一個失誤,我懷疑這種行為會改變,但仍不能保證是否是API的一部分。

或者,你可以測試返回的存儲庫的對象數據庫是否真實的存在。

Repository repository = repositoryBuilder.build();
if( repository.getObjectDatabase().exists() ) {
...
}

顧名思義, 如果有一個對象數據庫,ObjectDatabase.exists()返回true,否則返回false。

小技巧:findGitDir()

倉庫生成器提供了一個findGitDir()方法用於從指定的路徑開始搜索倉庫並且回退到上級目錄。

FileRepositoryBuilder repositoryBuilder = new FileRepositoryBuilder();
repositoryBuilder.addCeilingDirectory( new F‌ile( "/home/user" ) );
repositoryBuilder.findGitDir( new F‌ile( "/home/user/git/foo/bar" ) );

如果倉庫路徑被找到或者已到達根目錄則搜索結束。getGitDir()可以用於獲取搜索結果和返回找到的git路徑,如果沒找到則返回null。

通過添加一個或多個目錄可以限制搜索。只要目錄的其中一個被搜索到,則搜索結束。

另一種選擇:Git.open()

如果你覺得FileRepositoryBuilder不方便使用,可以用等效的簡寫形式:Git.open()。

Git git = Git.open( new F‌ile( "/path/to/repo/.git" ) );

這個方法要求一個位於倉庫中的表示路徑的文件作為參數。路徑可以是工作路徑或者git路徑。我建議在這裡使用git路徑。

如果給定的路徑不存在或者不包含git倉庫,將會拋出RepositoryNotFoundException異常。成功會返回Git類的實例,然後可以用它訪問倉庫(git.getRepository())和創建git命令。

JGit訪問Git倉庫的多種方式

Git.open()函數很簡短,而FileRepositoryBuilder給了你更多的控制和可靠的方式來判斷倉庫是否存在。你喜歡前者還是後者完全取決於你的使用情況。記住,不要直接使用FileRepositoryBuilder構造函數或者在沒有提前通知的情況下改變其行為。

我希望這篇文章有助於澄清怎樣使用JGit訪問倉庫。如果你有進一步的問題,請在評論中回復。

英文原文:How to Access a Git Repository with JGit

Linux git命令參數及用法詳解 http://www.linuxidc.com/Linux/2012-01/51205.htm

Fedora通過Http Proxy下載Git http://www.linuxidc.com/Linux/2009-12/23170.htm

在Ubuntu Server上安裝Git http://www.linuxidc.com/Linux/2009-06/20421.htm

服務器端Git倉庫的創建(Ubuntu) http://www.linuxidc.com/Linux/2011-02/32542.htm

Linux下Git簡單使用教程(以Android為例) http://www.linuxidc.com/Linux/2010-11/29883.htm

Git權威指南 PDF高清中文版 http://www.linuxidc.com/Linux/2013-10/91053.htm

Git 的詳細介紹:請點這裡
Git 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved