2015-02-24 90 views
3

当我们做git log --shortstat时,我们得到插入,删除和更改的行数。例如:如何统计JGit中插入/删除的行数

1 file changed, 9 insertions(+), 3 deletions(-) 

请帮助我获取插入,删除和更改的行数。

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

    RepoClone repoClone=new RepoClone(); 
    repoClone.repoCloner(); 
    repository =   builder.setGitDir(repoClone.repoDir).setMustExist(true).build(); 
    
  2. 我甚至能得到一个TreeWalk

    TreeWalk treeWalk=getCommitsTreeWalk(); 
    
  3. 我能够检索文件名,每个文件,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); 
        } 
    } 
    
  4. 现在,我想检索为每个文件插入和删除的行数。

请帮忙。 预先感谢。

回答

3

以下代码片段比较两个提交并打印更改。 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); 
    } 
} 

我想通过DiffEntryHunkHeader提供的信息,你应该能够获得所需的--shortstat

+0

非常感谢!我将尝试使用此代码来获取--shortstat类型的结果。对于这种比较,是否可以从文件存储库获取以前的提交并进行比较?我想比较“在一个月内”提交并产生插入和删除的行数。 – SJ03 2015-02-25 20:31:57

+0

这里的困难部分可能是找到给定月份中的第一次和最后一次提交。如果你从一个月的最后一次提交开始,你可以将其父母移到第一个。但是,如果合并提交(两个父母提交)介于两者之间,则需要遵循_path_的策略。 – 2015-02-26 19:54:39

+0

Ohk。就我而言,我只有一个分支,即“主”分支。如果我想比较单个分支中的提交,是否有可能。谢谢! – SJ03 2015-02-26 21:35:49