J Git InMemory просматривает коммиты одного файла - PullRequest
0 голосов
/ 19 июня 2020

для проекта мне нужно получить один файл из репозитория. Но мне нужно go через все коммиты. Идея состоит в том, чтобы отслеживать изменения внутри этого файла. Моя идея заключалась в том, чтобы создать репозиторий inMemory и просто скопировать один файл на диск. Но я не знаю, как перебирать коммиты для этого файла. Он отлично работает, если я подключаюсь к локальному репо git. Но у меня не будет его на сервере, на котором будет работать эта программа.

До сих пор я следил за этим .

Но когда я пытаюсь сделать что-то вроде

    LogCommand logCommand = git.log().addPath("componentModel.xml");
    List<ObjectId> commitIds = new ArrayList<>();
    for (RevCommit revCommit : logCommand.setMaxCount(20).call()) {
      commitIds.add(revCommit.getId());
      revCommit.disposeBody();
    }
    Collections.reverse(commitIds);

Я получаю сообщение об ошибке при достижении logcommand.call()

org.eclipse.j git .api.errors.NoHeadException: HEAD не существует и нет явной начальной версии был указан

в org.eclipse.j git .api.LogCommand.call (LogCommand. java: 131)

Пока это мой код

            DfsRepositoryDescription repoDesc = new DfsRepositoryDescription();
            InMemoryRepository repository = new InMemoryRepository(repoDesc);
            Git git = new Git(repository);
            git.fetch()
                    .setRemote(myRemoteGitRepo)
                    .setCredentialsProvider(new UsernamePasswordCredentialsProvider("myToken", ""))
                    .setRefSpecs(new RefSpec("+refs/heads/*:refs/heads/*"))
                    .call();
            repository.getObjectDatabase();
            
            LogCommand logCommand = git.log().addPath("componentModel.xml");
            List<ObjectId> commitIds = new ArrayList<>();
            for (RevCommit revCommit : logCommand.setMaxCount(20).call()) {
                commitIds.add(revCommit.getId());
                revCommit.disposeBody();
            }
            Collections.reverse(commitIds);

            for (ObjectId id : commitIds) {
               RevWalk revWalk = new RevWalk(repository)
               RevCommit commit = revWalk.parseCommit(id);
               RevTree tree = commit.getTree();
                    
               TreeWalk treeWalk = new TreeWalk(repository)
               treeWalk.addTree(tree);
               treeWalk.setRecursive(true);
               treeWalk.setFilter(PathFilter.create("componentModel.xml"));
               if (!treeWalk.next()) {
                 throw new IllegalStateException("Did not find expected file componentModel.xml");
               }
               ObjectId objectId = treeWalk.getObjectId(0);
               ObjectLoader loader = repository.open(objectId);
               FileOutputStream fileOutputStream = new FileOutputStream(path + "componentModel.xml", false);
               loader.copyTo(fileOutputStream);
               fileOutputStream.flush();
               fileOutputStream.close();
               transformXML(path, commit.getId().toString(), Date.from(Instant.ofEpochSecond(commit.getCommitTime())), extractJiraTicketNumber(commit.getFullMessage()));
            }

Спасибо за любую помощь!

...