Найдите правильного родителя коммита слияния неинтерактивным способом

Я готовлю миграцию svn2git, и хотя https://github.com/nirvdrum/svn2git был невероятно полезно, я все же закончил с парой махинаций. Я смог очистить большинство из них, но один все еще остается. У меня есть история, которая выглядит так:

A1 - B1 - C1 - E1 - F1
             \
A2 - B2 - C2 - D1

A1-C1 и A2-C2 идентичны, за исключением дополнительного уровня подкаталога. А2-С2 действительно артефакт миграции svn и предыдущих git-filter-branch операций, я в этом убедился. D1 — это коммит слияния, помеченный как release_2_0_4.

Я хочу избавиться от A2-C2. Я вижу два способа сделать это:

  1. Снимите тег D1, тег C1, срок действия журнала ссылок и сборка мусора. Пуф! А2-С2 больше нет.
  2. Я также мог бы переписать родителей D1, чтобы у него был только C1 в качестве родителя, с небольшим количеством магии git-filter-branch.

Я мог использовать первый метод, потому что содержимое файлов C1 и D1 идентично (проверено с помощью git diff C1 release_2_0_4), но тогда я потерял бы дату фиксации, автора и сообщение.

Второй метод будет:

git filter-branch --tag-name-filter cat --parent-filter 'test $GIT_COMMIT = [sha of release_2_0_4] && echo "-p [sha of FIRST parent of release_2_0_4]" || cat' -- --all

Я уже пробовал это вручную с жестко закодированным SHA, и это работает. Но мне нужно написать сценарий, не зная SHA.

Я знаю, как найти родителей D1, на них можно ссылаться с помощью обозначения вставки: release_2_0_4^1 и release_2_0_4^2 (нашел это здесь: Получить родителей коммита слияния в git), но я не знаю, как узнать, что есть что. Я делаю это в сценарии, а не в интерактивном режиме, и другие git-filter-branch операции могут изменить хэши SHA, поэтому мне нужно найти способ определить, какой из двух коммитов мне нужен. Единственная подсказка, которая у меня есть, заключается в том, что у C1 есть 2 дочерних коммита, а у C2 есть только один дочерний коммит.

Подводя итог, мои вопросы:

  • Как мне найти [sha of FIRST parent of release_2_0_4]?
  • Как поместить это в сценарий Bash, не путая с одинарными, двойными кавычками, расширением переменных и т. д.?

PS: мне не нужно беспокоиться об апстриме, ни один из репозиториев git, который может содержать этот код, не считается официальным, и они не будут, пока я не дам зеленый свет для миграции svn2git.


person Amedee Van Gasse    schedule 30.12.2014    source источник


Ответы (1)


Я обнаружил, что нет надежного способа сделать это, потому что git рассматривает каждого родителя как равного и просто использует их в том порядке, в котором он их получает.

Поэтому я сделал это вручную, как описано выше.

person Amedee Van Gasse    schedule 01.07.2015