Мне нужно создать некоторый обзор кода из несвязанных ветвей.
Примечание: при поиске решений не переходите на проблему контекста локального ветки, так как это будет выполняться на сервере, будет только удаленный источник, я всегда буду запускать git fetch origin перед другими командами, и когда мы будем говорить о ветвях, мы будем ссылаться на origin/branch-name.
Side-note 2: Я хорошо знаю, как git работает как в фарфоре, так и в сантехнике.
Если настройка будет простой, и каждая ветвь, которая возникла из мастера, будет продолжаться по своему собственному пути, мы могли бы просто запустить:
git rev-list origin/branch-name --not origin/master --no-merges
для каждой несвязанной ветки и добавить полученные коммиты к каждому обзору на каждую ветвь.
Проблема возникает при слиянии 2-3 веток и продолжении работы над некоторыми из них. Как я уже сказал, для каждого ветки я хочу создать программные обзоры программ, и я не хочу включать коммит в несколько обзоров.
В основном проблемы сводятся к поиску исходной ветки для каждой фиксации.
Или, проще говоря, найти все несвязанные коммиты, сгруппированные по ветке, которые, скорее всего, были созданы.
Давайте сосредоточимся на простом примере:
-
* b4 - branch2 head
* | a4 - branch1 head
| * b3
* | merge branch2 into branch1
* |\ | m3 - master head
| * \| a3
| | |
| | * b2
| * | merge master into branch1
* /| | m2
|/ | * merge branch1 into branch2
| * /| a2
| |/ |
| | * b1
| | /
| |/
| /|
|/ |
| * a1
* / m1
|/
|
* start
-
и я хочу получить:
- branch1: a1, a2, a3, a4
- branch2: b1, b2, b3, b4
Лучшей идеей решения, которую я нашел до сих пор, является запуск:
git show-branch --topo-order --topics origin/master origin/branch1 origin/branch2
и проанализируйте результат:
* [master] m3
! [branch1] a4
! [branch2] b4
---
+ [branch2] b4
+ [branch2^] b3
+ [branch1] a4
++ [branch2~2] b2
-- [branch2~3] Merge branch 'branch1' into branch2
++ [branch2~4] b1
+ [branch1~2] a3
+ [branch1~4] a2
++ [branch1~5] a1
*++ [branch2~5] m1
Выходная интерпретация выглядит так:
- Первые n строк анализируются n ветвей
- одна строка с помощью
- одна строка для каждой фиксации с плюсом (или минусом в случае коммитов) для n-го символа отступа, если это commit находится на n-й ветке.
- последняя строка - это база слияния для всех проанализированных ветвей.
Для точки 3. разрешение имени фиксации начинается с имени ветки и из того, что я вижу, эта ветвь соответствует ветвям, которые были созданы, возможно, путем продвижения пути, достигаемого первым родителем.
Поскольку меня не интересуют слияния, я проигнорирую их.
Затем я проанализирую каждую ветвь-путь-фиксацию, чтобы получить хэш с rev-parse.
У кого-нибудь есть лучшая программная идея для решения этой проблемы?