0

我在我的项目中使用 JGit,我必须维护用户上传的文件。如果该文件已经存在,那么它将创建相同的新版本并将客户与他提交/上传的文件集相关联。

它在本地工作文件,即上传的每个文件,将其提交到存储库,即服务器机器上,并将相同的记录添加到数据库中,以关联客户及其各自的文件版本控制列表,即 commitIds。

但是经过几次上传文件的迭代(每次上传可能包含大约 200 个文件),JGit 能够提交文件并正确生成 commitId,但在向用户显示提交的文件时无法检索文件的内容。

不幸的是,在检索文件时日志没有显示任何错误。

因此我迷路了......并且努力理解这里有什么问题。

我的问题是:

  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 存储库,aFile 是文件名

使用 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);
    }
}
4

1 回答 1

0

“缺少未知 0000”似乎表明您的引用之一丢失,并且正在为 objectId 返回 null。您应该检查是否objectId.equals(ObjectId.zeroId())在进行查找时。

您可能还想检查存储库是否需要垃圾收集(使用 JGit 或独立的 Git 客户端) - 默认情况下,JGit 不执行自动垃圾收集。

call()另请注意,在您调用该方法并再次获得提交之前,不会将提交插入数据库。也许这就是为什么您在代码中找不到它的原因?

于 2013-11-07T23:41:09.060 回答