2013-10-22 151 views
0

我正在使用JGit作爲我的項目,我必須維護用戶上傳的文件。 如果文件已經存在,那麼它會創建一個相同的新版本,並將客戶與他提交/上傳的一組文件相關聯。JGit可伸縮性限制

它在本地工作文件,即每個文件上載,將其提交到存儲庫,即在服務器機器上,並且添加記錄在DB中的相同文件,以關聯客戶及其各自的文件版本控制列表,即commitIds。

但是,在上傳文件迭代很少(每次上傳可能包含大約200個文件)後,JGit能夠提交文件並正確生成commitIds,但無法在向用戶顯示其提交的文件時檢索文件的內容。

遺憾的是,日誌在檢索文件時不會顯示任何錯誤。

因此,我迷路了......並且努力理解站在這兒出了什麼問題。

我的問題是:

  1. 是否JGIT有足夠的可擴展性?即提取時間會隨着它的增長而變得足夠快?

  2. 如果我正確檢索文件該怎麼辦。

下面是一段代碼,我使用

FileUtils.copyFile(aFile,destFile); 
AddCommand add = git.add(); 
add.addFilepattern(".").call(); 
CommitCommand commit = git.commit(); 
commit.setAuthor(user.getFirstName(), user.getUserId()); 
commit.setMessage("comments").call(); 
ObjectId lastCommitId = git.getRepository().resolve(org.eclipse.jgit.lib.Constants.HEAD); 

以上destFile是Git倉庫和å文件是文件名

使用lastCommitId我試圖以檢索的內容但我得到的文件:

MissingObjectException: Missing unknown 0000000000000000000000000000000000000000 

用於檢索文件的代碼是:

ObjectId lastCommitId = repo.resolve(lastCommitId); 

RevTree tree = commit.getTree(); 
TreeWalk treeWalk = new TreeWalk(repo); 
treeWalk.addTree(tree); 
treeWalk.setRecursive(true); 
treeWalk.setFilter(PathFilter.create("actial_File_Name")); //this is actual file name i used 

boolean next = treeWalk.next(); 
if (next) 
{ 
    ObjectId objectId = treeWalk.getObjectId(0); 
    log.logError(" objectId :" + objectId); 
    try{ 
     ObjectLoader loader = repo.open(objectId); 

     OutputStream out = new FileOutputStream(targetFile); ///targetFile is the actual file name i wanted to retreive the content i.e orginal name 
     loader.copyTo(out); 
    } 
} 

回答

0

'缺少未知0000'似乎表明您的某個引用缺失,並且返回的null爲objectId。當您執行查找時,您應該檢查objectId.equals(ObjectId.zeroId())

您可能還想檢查存儲庫是否需要垃圾回收(無論是使用JGit還是獨立的Git客戶端) - 默認情況下,JGit不會執行垃圾回收自動收集。

還要注意,在您調用call()方法並重新獲得提交之前,提交不會被插入到數據庫中。也許這就是爲什麼你不能在你的代碼中找到它?

+0

謝謝AlBlue,但是爲什麼首先在存儲庫中存在具有該commitId的對象時獲取zeroId?如何避免「MissingObjectException:遺漏未知的0000000000000000000000000000000000000000」? – user2907154

+0

在你的代碼中,你是否試圖在生成它的同一個進程中獲得提交? 我注意到,你似乎沒有做一個'call()',它實際上會把它保存到數據庫中。因此,任何嘗試打開該提交都會生成一個丟失的對象異常,因爲提交的id在用'call()'提交之前是'0000 ...'。 – AlBlue