слияние веток с хронологией
Есть такая ситуация: две 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 шт):
В общем, накидал небольшой скрипт на 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)
Если есть предложения к улучшению всегда готов принять.