2013-10-22 113 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