Java 如何计算JGit中插入/删除的行数

Java 如何计算JGit中插入/删除的行数,java,git,jgit,Java,Git,Jgit,当我们执行git log--shortstat时,我们会得到插入、删除和更改的行数。比如: 1 file changed, 9 insertions(+), 3 deletions(-) 请帮助我获取插入、删除和更改的行数 我正在做一个存储库克隆,以便在本地计算机上获取git项目。以下是相同的代码: RepoClone repoClone = new RepoClone(); repoClone.repoCloner(); repository = builder.setGitDir(r

当我们执行git log--shortstat时,我们会得到插入、删除和更改的行数。比如:

1 file changed, 9 insertions(+), 3 deletions(-)
请帮助我获取插入、删除和更改的行数

  • 我正在做一个存储库克隆,以便在本地计算机上获取git项目。以下是相同的代码:

     RepoClone repoClone = new RepoClone();
     repoClone.repoCloner();
     repository = builder.setGitDir(repoClone.repoDir).setMustExist(true).build();
    
  • 我甚至可以得到一个
    树漫游

     TreeWalk treeWalk = getCommitsTreeWalk();
    
  • 我能够检索文件名、每个文件的提交次数、LOC以及处理每个xml/java文件的开发人员数量

     while (treeWalk.next()) {
       if (treeWalk.getPathString().endsWith(".xml") || treeWalk.getPathString().endsWith(".java")) {
         jsonDataset = new JSONObject();
         countDevelopers = new HashSet<String>();
         count = 0;
         logs = new Git(repository).log().addPath(treeWalk.getPathString()).call();
         for (RevCommit rev: logs) {
           countDevelopers.add(rev.getAuthorIdent().getEmailAddress());
           count++;
         }
         jsonDataset.put("FileName", treeWalk.getPathString());
         jsonDataset.put("CountDevelopers", countDevelopers.size());
         jsonDataset.put("CountCommits", count);
         jsonDataset.put("LOC", countLines(treeWalk.getPathString()));
         commitDetails.put(jsonDataset);
       }
     }
    
    while(treeWalk.next()){
    if(treeWalk.getPathString().endsWith(“.xml”)| | treeWalk.getPathString().endsWith(“.java”)){
    jsonDataset=新的JSONObject();
    countDevelopers=newhashset();
    计数=0;
    logs=new Git(repository.log().addPath(treeWalk.getPathString()).call();
    for(RevCommit rev:logs){
    countDevelopers.add(rev.getAuthorIdent().getEmailAddress());
    计数++;
    }
    put(“文件名”,treeWalk.getPathString());
    jsonDataset.put(“CountDevelopers”,CountDevelopers.size());
    put(“CountCommits”,count);
    put(“LOC”,countLines(treeWalk.getPathString());
    提交详细资料(jsonDataset);
    }
    }
    
  • 现在,我想检索每个文件插入和删除的行数


  • 下面的代码片段比较两次提交并打印更改
    diffFormatter.scan()
    返回
    DiffEntry
    的列表,每个列表描述添加、删除或修改的文件。每个diff条目依次有一个
    HunkHeader
    s列表,其中描述了该文件中的更改

    // Create two commits to be compared
    File file = new File( git.getRepository().getWorkTree(), "file.txt" );
    writeFile( file, "line1\n" );
    RevCommit oldCommit = commitChanges();
    writeFile( file, "line1\nline2\n" );
    RevCommit newCommit = commitChanges();
    
    // Obtain tree iterators to traverse the tree of the old/new commit
    ObjectReader reader = git.getRepository().newObjectReader();
    CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
    oldTreeIter.reset( reader, oldCommit.getTree() );
    CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
    newTreeIter.reset( reader, newCommit.getTree() );
    
    // Use a DiffFormatter to compare new and old tree and return a list of changes
    DiffFormatter diffFormatter = new DiffFormatter( DisabledOutputStream.INSTANCE );
    diffFormatter.setRepository( git.getRepository() );
    diffFormatter.setContext( 0 );
    List<DiffEntry> entries = diffFormatter.scan( newTreeIter, oldTreeIter );
    
    // Print the contents of the DiffEntries
    for( DiffEntry entry : entries ) {
      System.out.println( entry );
      FileHeader fileHeader = diffFormatter.toFileHeader( entry );
      List<? extends HunkHeader> hunks = fileHeader.getHunks();
      for( HunkHeader hunk : hunks ) {
        System.out.println( hunk );
      }
    }
    
    //创建两个要比较的提交
    File File=新文件(git.getRepository().getWorkTree(),“File.txt”);
    writeFile(文件,“line1\n”);
    RevCommit oldcomit=commitChanges();
    writeFile(文件“line1\nline2\n”);
    RevCommit newCommit=commitChanges();
    //获取树迭代器以遍历旧/新提交的树
    ObjectReader=git.getRepository().newObjectReader();
    CanonicalTreeParser OldTreeItemer=新CanonicalTreeParser();
    reset(reader,oldCommit.getTree());
    CanonicalTreeParser newtreiter=新CanonicalTreeParser();
    reset(reader,newCommit.getTree());
    //使用DiffFormatter比较新旧树并返回更改列表
    DiffFormatter DiffFormatter=新的DiffFormatter(DisableDoutPtStream.INSTANCE);
    setRepository(git.getRepository());
    设置上下文(0);
    列表条目=diffFormatter.scan(newtreiter、oldTreeIter);
    //打印不同条目的内容
    对于(不同条目:条目){
    系统输出打印项次(输入);
    FileHeader FileHeader=diffFormatter.toFileHeader(条目);
    
    非常感谢!我将尝试这段代码以获得--shortstat类型的结果。对于这种比较,是否可以从存储库中获取以前提交的文件并进行比较?我想“在一个月内”比较提交并生成插入和删除的行数。此处的困难部分可能是查找给定月份的第一次和最后一次提交。如果从一个月的最后一次提交开始,则可以遍历其父级到第一次提交。但是如果合并提交(具有两个父级的提交)介于两者之间,您需要一个要遵循的策略。Ohk。在我的情况下,我只有一个分支,即“主”分支。如果我想比较单个分支中的提交,是否可能。谢谢!