简体   繁体   English

JGit:如何获得分支的所有提交? (无需更改工作目录......)

[英]JGit: How to get all commits of a branch? (Without changes to the working directory …)

how do I get all commits of a branch with JGit, without changing the working directory? 如何在不更改工作目录的情况下获取JGit分支的所有提交?

Unfortunately the JGit docs are not very good ... 不幸的是JGit文档不是很好......

In ruby with grit it is very easy: 用砂砾红宝石很容易:

repo = Grit::Repo.new(pathToRepo)

repo.commits(branchName, false).each do |commit|
    doSomethingWithTheCommit
end

Bye, hurik 再见,hurik

Tried this here first: https://stackoverflow.com/a/13925765/2246865 首先在这里尝试: https//stackoverflow.com/a/13925765/2246865

But it wasn't was working always, so I found this here: http://www.eclipse.org/forums/index.php/t/280339/ 但它总是不起作用,所以我在这里找到了: http//www.eclipse.org/forums/index.php/t/280339/

Here my solution, it isn't really nice, but it's working ... 在这里,我的解决方案,它不是很好,但它的工作......

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());
            }
        }
    }
}

With the code below you can get all commits of a branch or tag : 使用下面的代码,您可以获得分支或标记的所有提交

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());
}

The varialbe treeName will define the tag or branch. varialbe treeName将定义标记或分支。 This treeName is the complete name of the branch or tag, for example refs/heads/master for the master branch or refs/tags/v1.0 for a tag called v1.0 . treeName是分支或标记的完整名称,例如分支的refs/heads/master或名为v1.0的标记的refs/tags/v1.0 v1.0

Alternatively, you can use the gitective API. 或者,您可以使用gitective API。 The following code does the same as the code above: 以下代码与上面的代码相同:

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());
}

Some try/catch will be necessary, I hide them to make the code shorter. 有些try / catch是必要的,我隐藏它们以使代码更短。 Good luck. 祝好运。

I was just looking for a way to list all commits under each branch and I found this thread. 我只是想找到一种方法来列出每个分支下的所有提交,我找到了这个帖子。 I finally did something a bit different from some of the answers I found here and worked. 我终于做了一些与我在这里找到和工作的一些答案有所不同的东西。

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 谢谢您的帮助

You are right, the docs should really be better. 你说得对,该文档确实应该更好。

You could use the JGit Log command or use a library like gitective which makes iterating over commits easy. 您可以使用JGit Log命令或使用像gitective这样的库,这样可以轻松地迭代提交。 You can look at the source to learn more about JGit. 您可以查看源代码以了解有关JGit的更多信息。

Other (more complicated) ways are described in this SO-question . 这个SO问题中描述了其他(更复杂的)方法。

A much shorter and clean solution can be done via the "log" command that JGit provides: 可以通过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");

See the full snippet at the jgit-cookbook 请参阅jgit-cookbook完整代码段

This seems to work but I thought add(ObjectId branch) to provide a gate to the active branch, but I appear to require a range 这似乎工作,但我认为添加(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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM