Как я могу найти первый коммит ветки с JGit? - PullRequest
3 голосов
/ 16 октября 2019

Я хочу найти первый коммит для определенной ветви, используя библиотеку Eclipse JGit. Например, если у меня есть

master -- a -- c -- d -- e
          \
  feature  b -- f -- g -- h
            \
    another  j -- k -- l

// findBranchRoot() is the magic method we want to create
repository.resolve("feature").findBranchRoot().getId(); // this would return b
repository.resolve("another").findBranchRoot().getId(); // this would return j

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Проблема, с которой вы столкнетесь, заключается в том, что - и терпите меня, здесь - коммиты не «на ветвях». Чтобы увидеть это, рассмотрите график, который вы нарисовали. Это неоднозначно. Это неизбежноВы нарисовали

A---C---D---E          master
 \
  B---F---G---H        feature
   \
    J---k---L          another

, и просто не существует способа определить, было ли B выполнено «на» feature или another (или, в этом отношении, какой из трех A былсделано "на").

A---C---D---E          master
 \
  B---J---K---L        another
   \
    F---G---H          feature

показывает точно ту же историю. Все зависит от того, как вы решите интерпретировать это.

Если вы хотите связать коммит с какой-либо внешней административной записью, поместите маркер в сообщение коммита, это будет сделано, но в самом Git (и дляфактическая работа) важна структура истории, а не то, как ее биты упоминаются в этом репо или в этом.

Если придет время опубликовать feature или another, вы собираетесьнужно нажать B в любом случае, если только он не был передан как часть другой работы. Происхождение имеет значение. Имена ветвей не имеют.

0 голосов
/ 16 октября 2019

Если первый коммит означает самый последний / самый молодой коммит ветви, вы можете использовать ObjectId, возвращаемый Repository::resolve, чтобы получить RevCommit (представление объекта фиксации в JGit) сa RevWalk:

ObjectId commitId = repository.resolve("refs/heads/feature");
try(RevWalk revWalk = new RevWalk(repository)) {
  RevCommit commit = revWalk.parseCommit(commitId);
}

Я рекомендую передать полный квалифицированный реф в resolve (как в примере). В противном случае вы можете получить AmbiguousObjectException или метод вернет заметку или тег с таким же коротким именем.

...