слияние веток с хронологией

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

A - B - - - - - C < master

  D - E - F - G   < main

Желаемый результат:

A - D - B - E - F - G - C < master

Я погуглил немного и git merge или git rebase мне не поможет в простых случаях. Делать git cherry-pick на каждый коммит не хочется, так как история коммитов, вообще-то, больше, чем на схеме и ручная работа займёт много времени.

Могу предположить, что существуют какие-то скрипты или git-filter-repo что-то такое умеет, но у последнего как-то сложно с документацией. Или всё же встроенные команды типа git rebase могут сделать слияние.


Ответы (1 шт):

Автор решения: dimon4ezzz

В общем, накидал небольшой скрипт на Python с использованием GitPython. Дальше уже можно через git-filter-repo прогнать, чтобы сопоставить дату автора и коммита.

import git

repo = git.Repo("../repo")
commits = []
branches = repo.heads
for branch in branches:
  commits += list(repo.iter_commits(branch))
commits.sort(key = lambda x: x.authored_date)
repo.create_head("temp", commit = commits[0])
repo.git.checkout("temp")
commits.pop(0) # чтобы два раза не повторять initial commit
for commit in commits:
  print(commit.authored_datetime, commit.hexsha)
  repo.git.cherry_pick(commit.hexsha)

Если есть предложения к улучшению всегда готов принять.

→ Ссылка