Java 使用JGit计算文件上的提交数
我正在尝试使用Java按提交次数列出git存储库中存在的所有文件。为此,我使用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
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();
}
}