如何在 jgit 中通过 ObjectId 获取文件

问题描述 投票:0回答:2

我的目录中的每个文件都有一些 objectId,过了一段时间我想通过 objectId 找到这个文件。 我只能用困难的方式让它......但也许有/有其他解决方案吗?

这就是我的方式

public String findFolderDtoNameByObjectId(Repository repository, String objectId) throws IOException {
    Ref head = repository.findRef(Constants.HEAD);
    if (head == null) {
        throw new NullPointerException();
    }
    try (RevWalk walk = new RevWalk(repository)) {
        RevCommit commit = walk.parseCommit(head.getObjectId());
        RevTree tree = commit.getTree();

        try (TreeWalk treeWalk = new TreeWalk(repository)) {
            treeWalk.addTree(tree);
            treeWalk.setRecursive(true);
            while (treeWalk.next()) {
                if (treeWalk.getObjectId(0).getName().equals(objectId)) {
                    GitFileDto dto = new GitFileDto();
                    dto.setFullPath(treeWalk.getPathString());
                    dto.setName(treeWalk.getNameString());
                    dto.setObjectId(treeWalk.getObjectId(0).getName());
                    dto.setContent(getContentFromTree(treeWalk, repository));
                    return dto;         
                 } else if (treeWalk.isSubtree()) {
                    treeWalk.enterSubtree();
                }
            }
        }
    }
    return null;
}
java jgit
2个回答
0
投票

不确定 100%,但试试这个...

ObjectId oid = ObjectId.fromString(objectId);
ObjectDatabase od = repository.getObjectDatabase();
if(od.has​(oid)) {
    // whatever you want to do with the object
    // Load using..  ObjectLoader ol = od.open​(AnyObjectId objectId);
    // Or return Name
}

0
投票

我的答案是

public GitFileDto findFileDtoByObjectId(Repository repository, String objectId) throws IOException {

    Ref head = repository.findRef(HEAD);
    try (RevWalk walk = new RevWalk(repository)) {
        RevCommit commit = walk.parseCommit(head.getObjectId());
        RevTree tree = commit.getTree();

        try (TreeWalk treeWalk = new TreeWalk(repository)) {
            treeWalk.addTree(tree);
            treeWalk.setRecursive(true);
            while (treeWalk.next()) {
                ObjectId objectId1 = treeWalk.getObjectId(0);
                if (objectId1 != null && objectId.equals(objectId1.getName())) {
                    return getGitFileDto(repository, treeWalk);
                }
            }
        }
    }
    throw new Exception(String.format("There is no file with objectId: %s ", objectId));
}


private GitFileDto getGitFileDto(Repository repository, TreeWalk treeWalk) throws IOException {

    GitFileDto dto = new GitFileDto();
    dto.setFullPath(treeWalk.getPathString());
    dto.setName(treeWalk.getNameString());
    
    ObjectId objectId = treeWalk.getObjectId(0);

    dto.setObjectId(objectId.getName());

   try (ObjectReader objectReader = repository.newObjectReader()) {
        ObjectLoader objectLoader = objectReader.open(objectId);
        byte[] bytes = objectLoader.getBytes();
       
        dto.setContent(new String(bytes, StandardCharsets.UTF_8));
    }
    return dto;
}

但我不喜欢这样,因为我必须自己解析整棵树,而且我觉得它很奇怪而且很慢

© www.soinside.com 2019 - 2024. All rights reserved.