JGit:如何获取一个分支的所有提交?(不改变工作目录…)



如何在不更改工作目录的情况下使用JGit获得分支的所有提交?

不幸的是,JGit文档不是很好…

在有砂砾的红宝石中很容易:

repo = Grit::Repo.new(pathToRepo)
repo.commits(branchName, false).each do |commit|
    doSomethingWithTheCommit
end

再见,hurik

使用下面的代码,您可以获得分支或标签的所有提交:

Repository repository = new FileRepository("/path/to/repository/.git");
String treeName = "refs/heads/master"; // tag or branch
for (RevCommit commit : git.log().add(repository.resolve(treeName)).call()) {
    System.out.println(commit.getName());
}

变量treeName将定义标记或分支。此treeName是分支或标记的完整名称,例如,refs/heads/master用于分支,refs/tags/v1.0用于称为v1.0的标记。

或者,您可以使用目标API。下面的代码与上面的代码相同:

Repository repository = new FileRepository("/path/to/repository/.git");
AndCommitFilter filters = new AndCommitFilter();
CommitListFilter revCommits = new CommitListFilter();
filters.add(revCommits);
CommitFinder finder = new CommitFinder(repository);
finder.setFilter(filters);
String treeName = "refs/heads/master"; // tag or branch
finder.findFrom(treeName);
for (RevCommit commit : revCommits) {
    System.out.println(commit.getName());
}
有些try/catch是必要的,我隐藏它们以使代码更短。好运。

先试一下:https://stackoverflow.com/a/13925765/2246865

但它并不总是工作,所以我在这里找到了这个:http://www.eclipse.org/forums/index.php/t/280339/

这是我的解决方案,它不是很好,但它正在工作…

public static void main(String[] args) throws IOException, GitAPIException {
    Repository repo = new FileRepository("pathToRepo/.git");
    Git git = new Git(repo);
    RevWalk walk = new RevWalk(repo);
    List<Ref> branches = git.branchList().call();
    for (Ref branch : branches) {
        String branchName = branch.getName();
        System.out.println("Commits of branch: " + branch.getName());
        System.out.println("-------------------------------------");
        Iterable<RevCommit> commits = git.log().all().call();
        for (RevCommit commit : commits) {
            boolean foundInThisBranch = false;
            RevCommit targetCommit = walk.parseCommit(repo.resolve(
                    commit.getName()));
            for (Map.Entry<String, Ref> e : repo.getAllRefs().entrySet()) {
                if (e.getKey().startsWith(Constants.R_HEADS)) {
                    if (walk.isMergedInto(targetCommit, walk.parseCommit(
                            e.getValue().getObjectId()))) {
                        String foundInBranch = e.getValue().getName();
                        if (branchName.equals(foundInBranch)) {
                            foundInThisBranch = true;
                            break;
                        }
                    }
                }
            }
            if (foundInThisBranch) {
                System.out.println(commit.getName());
                System.out.println(commit.getAuthorIdent().getName());
                System.out.println(new Date(commit.getCommitTime() * 1000L));
                System.out.println(commit.getFullMessage());
            }
        }
    }
}

我只是在寻找一种方法来列出每个分支下的所有提交,我发现了这个线程。我终于做了一些与我在这里找到的一些答案有点不同的事情,并且奏效了。

public static void main(String[] args) throws IOException, GitAPIException {
    Repository repo = new FileRepository("pathToRepo/.git");
    Git git = new Git(repo);
    List<Ref> branches = git.branchList().call();
    for (Ref branch : branches) {
        String branchName = branch.getName();
        System.out.println("Commits of branch: " + branchName);
        System.out.println("-------------------------------------");
        Iterable<RevCommit> commits = git.log().add(repo.resolve(branchName)).call();
        List<RevCommit> commitsList = Lists.newArrayList(commits.iterator());
        for (RevCommit commit : commitsList) {
            System.out.println(commit.getName());
            System.out.println(commit.getAuthorIdent().getName());
            System.out.println(new Date(commit.getCommitTime() * 1000L));
            System.out.println(commit.getFullMessage());
        }
    }
    git.close();
}

Thanks for the help

你说得对,文档确实应该更好。

你可以使用JGit Log命令或使用像gitective这样的库,它使迭代提交变得容易。您可以查看源代码以了解更多关于JGit的信息。

在这个SO-question中还描述了其他(更复杂的)方法

通过JGit提供的"log"命令可以实现一个更短、更简洁的解决方案:

    Repository repository = new FileRepository("pathToRepo/.git");
    logs = new Git(repository).log()
            .add(repository.resolve("remotes/origin/testbranch"))
            .call();
    count = 0;
    for (RevCommit rev : logs) {
        System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */);
        count++;
    }
    System.out.println("Had " + count + " commits overall on test-branch");

在jgit-cookbook

查看完整的代码片段

这似乎有效,但我认为add(ObjectId分支)提供一个门到活动分支,但我似乎需要一个范围

Git git = ...
ObjectId master = git.repository.resolve("refs/heads/master")
ObjectId branch = git.repository.resolve("refs/heads/mybranch")
git.log().addRange(master,branch).call()

最新更新