Как найти ветку для фиксации с помощью JGit?

Мне нужно получить имя ветки, связанной с конкретным коммитом, с помощью JGit. Я использовал JGit, чтобы получить полный список коммитов SHA для репозитория, и теперь мне нужно знать имя ветки, к которой он принадлежит.

Цените, если кто-то может сообщить мне, как я могу этого добиться.


person Tony P    schedule 03.11.2017    source источник
comment
Просто упомяну, что только подсказки (самая последняя фиксация) веток фактически связаны с веткой. Для других коммитов вы можете только догадываться, глядя на график и историю коммитов.   -  person everton    schedule 03.11.2017


Ответы (2)


В Git коммит не принадлежит ветке. Коммит неизменен, тогда как ветви могут изменять свое имя, а также коммит, на который они указывают.

Фиксация достижима из ветки (или тега, или другой ссылки), если есть ветка, которая либо напрямую указывает на фиксацию, либо на преемника фиксации.

В JGit NameRevCommand можно использовать для поиска ветки, если таковая имеется, которая напрямую указывает на фиксацию. Например:

Map<ObjectId, String> map = git
  .nameRev()
  .addPrefix("refs/heads")
  .add(ObjectId.fromString("<SHA-1>"))
  .call();

Приведенный выше фрагмент ищет в пространстве имен refs/heads ссылку, указывающую на данную фиксацию. Возвращенная карта содержит не более одной записи, где ключом является заданный идентификатор фиксации, а значение обозначает ветвь, которая на нее указывает.

person Rüdiger Herrmann    schedule 03.11.2017
comment
Что это означает, когда данная карта пуста (только что столкнулся с такой проблемой, когда ожидается мастер - person Antoniossss; 26.10.2018
comment
Похоже, что не было найдено ссылки, указывающей на идентификатор фиксации, указанный с помощью add. Родной Git что-то возвращает? - person Rüdiger Herrmann; 26.10.2018
comment
Не проверял (так как это временный репозиторий, получена только одна ветка). Я подозреваю, что это имеет какое-то отношение к тому факту, что я на самом деле использую fetch_head - например. Мне пришлось использовать дополнительные ссылки, чтобы log работал, поскольку refs пустые в базе данных репозитория. Если я получаю с .all(), имя ветки найдено (и нет необходимости использовать additionalRefs. - person Antoniossss; 26.10.2018
comment
Вы можете попробовать использовать addRef с Ref для FETCH_HEAD, чтобы команда учла это. - person Rüdiger Herrmann; 27.10.2018

Как говорится в документе:

Список классов

ListBranchCommand setContains (String containsCommitish)

setContains

public ListBranchCommand setContains(String containsCommitish)

If this is set, only the branches that contain the specified commit-ish as an ancestor are returned.

Parameters:
containsCommitish - a commit ID or ref name

Returns:
this instance

Since:
3.4

Этот API соответствует git branch --contains <commit-ish>

Вам также может понадобиться этот api, если вы хотите перечислить удаленные ветки (-r) или как удаленные, так и локальные ветки (-a),

setListMode

public ListBranchCommand setListMode(ListBranchCommand.ListMode listMode)

Parameters:
listMode - optional: corresponds to the -r/-a options; by default, only local branches will be listed

Returns:
this instance

Образец:

#list all the branches that "HEAD" belongs to.
try {
    Git git = Git.open(new File("D:/foo/.git"));
    List<Ref> refs = git.branchList().setContains("HEAD").setListMode(ListBranchCommand.ListMode.ALL).call();
    System.out.println(refs);
} catch (Exception e) {
    System.out.println(e);
}
person ElpieKay    schedule 03.11.2017