Java 如何计算JGit中插入/删除的行数
当我们执行git log--shortstat时,我们会得到插入、删除和更改的行数。比如: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
1 file changed, 9 insertions(+), 3 deletions(-)
请帮助我获取插入、删除和更改的行数
RepoClone repoClone = new RepoClone();
repoClone.repoCloner();
repository = builder.setGitDir(repoClone.repoDir).setMustExist(true).build();
树漫游:
TreeWalk treeWalk = getCommitsTreeWalk();
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。在我的情况下,我只有一个分支,即“主”分支。如果我想比较单个分支中的提交,是否可能。谢谢!