Я готовлю миграцию 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. Я вижу два способа сделать это:
- Снимите тег D1, тег C1, срок действия журнала ссылок и сборка мусора. Пуф! А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.