Поиск запросов на извлечение / слияния по сообщению о фиксации и выделение всех соответствующих коммитов

#git #intellij-idea #atlassian-sourcetree

#git #intellij-идея #atlassian-sourcetree

Вопрос:

Рассмотрим следующую историю:

       #1    #2    #3   PR no.

-O-----A-----B-----C   commits on master (merges)
     /    /    /
   1-2   3-4   5-6     commits on branches
 

Как видно, было 3 PR, объединенных через коммиты A, B, C. Сообщения о фиксации этих слияний содержат ключи проблем:

  • Ответ: «Объединить FIB-13 …»
  • B: «Объединить FIB-21 …»
  • C: «Объединить FIB-34 …»

Теперь я хотел бы выполнить поиск определенных проблем и получить список коммитов, которые они представили:

 Input: List of issue keys
Output: List of commits from PRs

Example
-------

Input: FIB-13, FIB-34
Output: 1, 2, 5, 6
 

После этого я хотел бы перенести эти коммиты в другую ветку, зафиксировать фиксацией:

 -1-2-5-6   another branch
 

Есть ли хороший способ написать сценарий для этого и / или это может быть достигнуто с помощью Git-клиента IntelliJ или Sourcetree?

Комментарии:

1. «найдите определенные проблемы и получите список коммитов, которые они представили» вы ищете git-bisect?

2. @evolutionxbox нет, я должен найти коммиты слияния по определенной строке, получить введенные ими коммиты и выбрать их.

3. Как бы вы узнали, какие коммиты они представили? Какой родитель вы используете? Или один путь содержит только коммиты слияния?

4. @evolutionxbox точно, master в основном состоит из слияний. Меня всегда интересует родительский / путь из других ветвей. В приведенном выше примере для слияния A выполните фиксацию 2, для слияния C зафиксируйте 6.

5. Похоже, вы хотите найти коммиты слияния через git log --first-parent --merges master (или эквивалент с git rev-list ), затем используйте их и их сообщения для запуска второго журнала или rev-list, используя второй родительский элемент указанных слияний, с точкой «stop» (start?), Указанной первым родительским элементом соответствующего слияния. Это довольно просто, как сценарий оболочки ; Я избегаю графических интерфейсов, которые обычно совершенно бесполезны для такого рода вещей, поэтому я не знаю, подходит ли для этого клиент IntelliJ или Sourcetree.

Ответ №1:

Из того, что я прочитал в комментариях, первое препятствие, с которым вы столкнулись, — это поиск всех коммитов, которые вы хотите git cherry-pick . Как предложил @torek, это можно легко сделать с git log помощью или git rev-list . В основном что-то вроде этого:

 #!/bin/bash
first_log="git rev-list --reverse --merges"
for feature in $@ 
do
    first_log =" --grep="^Merge ${feature}"" 
done

for cmt in $(eval "$first_log master")
do
    git log --format="%h: %s" --reverse ${cmt}^2 ^${cmt}^1
done
 

Краткое объяснение того, что он делает:
Он перебирает входные параметры $@ и добавляет столько --grep , сколько идентификаторов функций, которые вы передали. Затем он оценивает git rev-list команду и для каждого найденного коммита слияния извлекает все коммиты, принадлежащие второму родительскому элементу коммита слияния, который является подсказкой ветви функций, но недоступен для первого родительского элемента коммита слияния, который является предыдущим коммитом в главной ветви : ${cmt}^2 ^${cmt}^1 . Преимущество этого заключается в том, что он находит даже коммиты дочерних ветвей, происходящих из ветви функций.

Чтобы получить обратный хронологический порядок, вам просто нужно добавить --reverse опцию для обоих git log и git rev-list .

Пример ввода:

 ./script.sh FIB-13 FIB-34
 

Пример вывода:

 429ab60: 1
c458a31: 2
1c0d098: 5
3bd087c: 6
 

Как только вы приедете сюда, выбор вишни должен быть довольно простым.

Комментарии:

1. Хммм, вторая часть script ( git log ), похоже, дает другой результат. Когда я передаю коммит слияния для FIB-34, он возвращает все предыдущие коммиты (также из других ветвей / слияний)? Смотрите: i.imgur.com/BUtVPKR.png

2. Вы забыли ^ впереди 5d19020^1 .

3. Ах, большое спасибо. Также за отличное объяснение.