我的目录中的每个文件都有一些 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;
}
不确定 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
}
我的答案是
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;
}
但我不喜欢这样,因为我必须自己解析整棵树,而且我觉得它很奇怪而且很慢