Я готовлю миграцию svn2git, и хотя https://github.com/nirvdrum/svn2git был невероятно полезен, я все же закончил с парой шенидов. Я смог очистить большинство из них, но все еще остается. У меня есть история, которая выглядит следующим образом:Найти правильный родительский элемент слияния в неинтерактивном режиме
A1 - B1 - C1 - E1 - F1
\
A2 - B2 - C2 - D1
A1-C1 и A2-C2 идентичны, за дополнительный уровень подкаталога исключения. A2-C2 действительно является артефактом миграции svn и предыдущих операций git-filter-branch
, я убедился в этом. D1 - это слияние, помеченное как release_2_0_4
.
Я хочу избавиться от A2-C2. Я вижу два способа сделать это:
- Untag D1, tag C1, reflog expire and garbage collect. Пуф! A2-C2 ушел.
- Я мог бы также переписать родителей 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
(обнаружили, что здесь: Get parents of a merge commit in git), но я не знаю, как я могу узнать, что есть что. Я делаю это в сценарии, а не в интерактивном режиме, а другие операции git-filter-branch
могут изменять хэши SHA, поэтому мне нужно найти способ определить, какая из двух коммиттов мне нужна. Единственный ключ, который у меня есть, состоит в том, что C1 имеет 2 ребенка, а C2 имеет только один ребенок.
Итак, мои вопросы:
- Как я могу найти
[sha of FIRST parent of release_2_0_4]
? - Как поместить это в скрипт Bash без путаницы с одинарными кавычками, двойными кавычками, расширением переменной и т. Д.?
PS: Мне не нужно беспокоиться о вверх по течению, ни один из GIT операции РЕПО, которые там могут содержать этот код не считаются официальными, и они не будут, пока не даст зеленый свет для миграции svn2git.