Java 使用JGit计算文件上的提交数

Java 使用JGit计算文件上的提交数,java,jgit,Java,Jgit,我正在尝试使用Java按提交次数列出git存储库中存在的所有文件。为此,我使用JGit库 String filename = "/a/b/c.java"; String localPath = localPath; Repository localRepo = new FileRepository(localPath + "/.git"); Git git = new Git(localRepo); ObjectId head = localRepo.resolve(Constants.HEAD

我正在尝试使用Java按提交次数列出git存储库中存在的所有文件。为此,我使用JGit库

String filename = "/a/b/c.java";
String localPath = localPath;
Repository localRepo = new FileRepository(localPath + "/.git");
Git git = new Git(localRepo);
ObjectId head = localRepo.resolve(Constants.HEAD);
Iterable<RevCommit> logs = git.log().add(head).addPath(filename).call();
for (RevCommit revCommit : logs) {
    count++;
}
但是,我没有得到正确的答案,即使我更改到包含
c.java
的目录,我仍然没有得到正确的答案:

String filename = "c.java";
String localPath = localPath;
Repository localRepo = new FileRepository(localPath + "/.git");
Git git = new Git(localRepo);
ObjectId head = localRepo.resolve(Constants.HEAD);
System.setProperty("user.dir", localPath + "a/b";
Iterable<RevCommit> logs = git.log().add(head).addPath(filename).call();
for (RevCommit revCommit : logs) {
    count++;
}
String filename=“c.java”;
字符串localPath=localPath;
Repository localRepo=newfilerepository(localPath+“/.git”);
Git Git=新Git(localRepo);
ObjectId head=localRepo.resolve(Constants.head);
System.setProperty(“user.dir”,localPath+“a/b”;
Iterable logs=git.log().add(head).addPath(filename.call();
for(RevCommit RevCommit:logs){
计数++;
}
有人能帮我理解我做错了什么吗?

错误在这里:

String filename = "/a/b/c.java";
请尝试存储库相对路径(假设
a
是存储库根目录中的一个目录):


您的代码段没有显示提交是如何创建的/存储库处于何种状态。不过,有一点是肯定的:像在上一个代码段中那样设置系统属性
user.dir
是无用的,JGit不会对其进行评估

下面不是完全正确的答案,但这是一个如何将
git log
限制为文件夹中的特定文件的工作示例。使用最新版本的JGit运行代码成功

public class LogLearningTest {
  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  private Git git;
  private File file;

  @Test
  public void testCountNumberOfCommitsOnFile() throws Exception {
    writeFile( "initial content" );
    commitAll( "Create file in folder" );
    commitAll( "Unrelated commit" );
    writeFile( "changed content" );
    commitAll( "Change file in folder" );
    git.commit().setMessage( "Other commit" ).call();

    Iterable<RevCommit> logs = git.log().addPath( "folder/file" ).call();
    int count = 0;
    for( RevCommit revCommit : logs ) {
      count++;
    }

    assertEquals( 2, count );
  }

  @Before
  public void setUp() throws GitAPIException {
    git = Git.init().setDirectory( tempFolder.getRoot() ).call();
    File folder = new File( git.getRepository().getWorkTree(), "folder" );
    folder.mkdir();
    file = new File( folder, "file" );
  }

  @After
  public void tearDown() {
    git.getRepository().close();
  }

  private void writeFile( String content ) throws IOException {
    FileOutputStream outputStream = new FileOutputStream( file );
    outputStream.write( content.getBytes( "UTF-8" ) );
    outputStream.close();
  }

  private void commitAll( String message ) throws GitAPIException {
    git.add().addFilepattern( "." ).call();
    git.commit().setMessage( message ).call();
  }

}
公共类日志学习测试{
@统治
public TemporaryFolder tempFolder=new TemporaryFolder();
私人吉特;
私有文件;
@试验
public void TestCountNumberOfCommitConfigle()引发异常{
书面文件(“初始内容”);
提交(“在文件夹中创建文件”);
提交(“无关提交”);
可写文件(“更改内容”);
提交(“更改文件夹中的文件”);
git.commit().setMessage(“其他提交”).call();
Iterable logs=git.log().addPath(“文件夹/文件”).call();
整数计数=0;
for(RevCommit RevCommit:logs){
计数++;
}
资产质量(2,计数);
}
@以前
public void setUp()引发GitAPIException{
git=git.init().setDirectory(tempFolder.getRoot()).call();
文件夹=新文件(git.getRepository().getWorkTree(),“文件夹”);
folder.mkdir();
文件=新文件(文件夹,“文件”);
}
@之后
公共无效拆卸(){
git.getRepository().close();
}
私有void writeFile(字符串内容)引发IOException{
FileOutputStream outputStream=新的FileOutputStream(文件);
outputStream.write(content.getBytes(“UTF-8”);
outputStream.close();
}
私有void commitAll(字符串消息)引发GitAPIException{
git.add().addFilepattern(“.”.call();
git.commit().setMessage(message.call();
}
}

这也没有帮助。:(您能发布一个自包含的代码段来创建要计数的提交吗?这可能有助于跟踪问题。问题是因为我同时使用了Windows文件夹分隔符()和Unix分隔符(/)因为我从错误的配置文件读取。现在它已修复。您的
addPath
触发了它。谢谢。)
String filename = "a/b/c.java";
public class LogLearningTest {
  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  private Git git;
  private File file;

  @Test
  public void testCountNumberOfCommitsOnFile() throws Exception {
    writeFile( "initial content" );
    commitAll( "Create file in folder" );
    commitAll( "Unrelated commit" );
    writeFile( "changed content" );
    commitAll( "Change file in folder" );
    git.commit().setMessage( "Other commit" ).call();

    Iterable<RevCommit> logs = git.log().addPath( "folder/file" ).call();
    int count = 0;
    for( RevCommit revCommit : logs ) {
      count++;
    }

    assertEquals( 2, count );
  }

  @Before
  public void setUp() throws GitAPIException {
    git = Git.init().setDirectory( tempFolder.getRoot() ).call();
    File folder = new File( git.getRepository().getWorkTree(), "folder" );
    folder.mkdir();
    file = new File( folder, "file" );
  }

  @After
  public void tearDown() {
    git.getRepository().close();
  }

  private void writeFile( String content ) throws IOException {
    FileOutputStream outputStream = new FileOutputStream( file );
    outputStream.write( content.getBytes( "UTF-8" ) );
    outputStream.close();
  }

  private void commitAll( String message ) throws GitAPIException {
    git.add().addFilepattern( "." ).call();
    git.commit().setMessage( message ).call();
  }

}