2014-12-30 5 views
1

Я готовлю миграцию 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. Я вижу два способа сделать это:

  1. Untag D1, tag C1, reflog expire and garbage collect. Пуф! A2-C2 ушел.
  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 (обнаружили, что здесь: 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.

ответ

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^