我正在使用JGit作为我的项目,我必须维护用户上传的文件。 如果文件已经存在,那么它会创建一个相同的新版本,并将客户与他提交/上传的一组文件相关联。JGit可伸缩性限制
它在本地工作文件,即每个文件上载,将其提交到存储库,即在服务器机器上,并且添加记录在DB中的相同文件,以关联客户及其各自的文件版本控制列表,即commitIds。
但是,在上传文件迭代很少(每次上传可能包含大约200个文件)后,JGit能够提交文件并正确生成commitIds,但无法在向用户显示其提交的文件时检索文件的内容。
遗憾的是,日志在检索文件时不会显示任何错误。
因此,我迷路了......并且努力理解站在这儿出了什么问题。
我的问题是:
是否JGIT有足够的可扩展性?即提取时间会随着它的增长而变得足够快?
如果我正确检索文件该怎么办。
下面是一段代码,我使用
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);
}
}
谢谢AlBlue,但是为什么首先在存储库中存在具有该commitId的对象时获取zeroId?如何避免“MissingObjectException:遗漏未知的0000000000000000000000000000000000000000”? – user2907154
在你的代码中,你是否试图在生成它的同一个进程中获得提交? 我注意到,你似乎没有做一个'call()',它实际上会把它保存到数据库中。因此,任何尝试打开该提交都会生成一个丢失的对象异常,因为提交的id在用'call()'提交之前是'0000 ...'。 – AlBlue