JGit: как получить ветвь при обходе репозиториев

Отсутствующие документы JGit, похоже, ничего не говорят о том, как использовать/обнаруживать ветки при использовании RevWalk.

Этот вопрос говорит почти то же самое.

Итак, мой вопрос: как мне получить имя/идентификатор ветки из RevCommit? Или как указать, какую ветвь нужно пройти заранее?


person Braden    schedule 03.05.2012    source источник


Ответы (3)


Нашел лучший способ сделать это, зацикливая ветки.

Я зациклился на ветвях, позвонив

for (Ref branch : git.branchList().call()){
    git.checkout().setName(branch.getName()).call();
    // Then just revwalk as normal.
}
person Braden    schedule 04.05.2012
comment
+1 нет обхода одной ветки. Мой ответ был больше о поиске ветки с коммитом. - person VonC; 04.05.2012

Глядя на текущую реализацию JGit (см. репозиторий git и его RevCommit), я не нашел эквивалента того, что указано в "Git: поиск ветки, из которой поступил коммит".
То есть:

git branch --contains <commit>

Реализованы только некоторые параметры git branch (например, в ListBranchCommand.java).

person VonC    schedule 03.05.2012
comment
Да, похоже, что нет поддержки перехода из ветки commit -> ветки, но знаете ли вы, возможен ли обход коммитов только одной ветки? - person Braden; 04.05.2012
comment
+1, потому что ваш ответ помог мне двигаться в правильном направлении. Интересно посмотреть, что именно они реализовали. - person Braden; 04.05.2012

можно использовать приведенный ниже код, чтобы получить ветку "из" путем фиксации:

/**
     * find out which branch that specified commit come from.
     * 
     * @param commit
     * @return branch name.
     * @throws GitException 
     */
    public String getFromBranch(RevCommit commit) throws GitException{
        try {
            Collection<ReflogEntry> entries = git.reflog().call();
            for (ReflogEntry entry:entries){
                if (!entry.getOldId().getName().equals(commit.getName())){
                    continue;
                }

                CheckoutEntry checkOutEntry = entry.parseCheckout();
                if (checkOutEntry != null){
                    return checkOutEntry.getFromBranch();
                }
            }

            return null;
        } catch (Exception e) {
            throw new GitException("fail to get ref log.", e);
        }
    }
person YunFeng    schedule 18.12.2012
comment
Очень интересно, но я подозреваю, что это не масштабируется для большого репозитория. - person Peter Kahn; 12.02.2016