Вы должны быть в состоянии сделать это с помощью трансплантата. Как я понимаю, прививка предназначена для использования в старых хранилищах. Это позволяет вам вручную сообщить git, что у некоторого ref есть общий родительский элемент.
Как уже упоминалось в комментариях, может быть более простое решение. Это сработало бы, если бы все остальное не удалось.
Вы бы сбросили текущий репозиторий git (с помощью git или git-svn) и добавили свой старый репозиторий git-svn в качестве удаленного. Они не будут связаны, поэтому gitk будет выглядеть так:
У меня произошел инцидент на работе, когда некоторые из нас делали копию файловой системы вместо svn-копии, поэтому некоторые из названий моих ветвей ссылаются на это. Надеюсь, это все равно имеет смысл. Очень повезло, что у меня просто есть все эти изображения и истории. Каковы шансы!? Наверное, довольно хорошо, git-svn легко запутать.
В ветке copied_from они скопированы. Graft_ref - то, где это встретилось. Они добавили кучу файлов, изменили свойства, а затем изменили некоторые файлы. Это было немного беспорядка.
Общая идея состоит в том, чтобы получить индекс исходного источника, но содержимое файла, чтобы соответствовать изменениям. Итак, мы начинаем с ветки ref, затем сбрасываем смешанный, чтобы получить индекс.
$ git checkout graft_ref
$ git checkout -b graft_parent
$ git reset --mixed copied_from
Если вы не вносили изменения между двумя ветвями, когда он был сломан, вам не нужно беспокоиться об этом шаге.
$ git commit -a -m "svn_branch changes made on svn_trunk filesystem copy"
Теперь нам нужно сделать фактический прививку. Я обрезал хеши здесь для удобства чтения.
$ git log -1 --pretty=format:%H graft_ref
631d3c84e35de98236c3d36c08d14ec92f9c62ae
$ git log -1 --pretty=format:%H graft_parent
96a4e87b554e0030035d35ca3aac23e9d71962af
$ echo "631d3... 96a4e8..." > .git/info/grafts
Что выглядит так, как вы ожидаете. Теперь нам просто нужно перенести изменения в дерево. Мои записи для этого отсутствуют, но я думаю, что это то, что я бы сделал, хе-хе.
$ git checkout svn_branch/master
$ git checkout -b consolidate_changes
$ git rebase master
Вы должны быть в состоянии протолкнуть эти изменения куда угодно. Хотя git не отслеживает прививки, поэтому привитая ветка (svn_branch / master и friends) снова сломается. Это фактически мертвое дерево, если вы снова не сделаете прививку. Для git-svn это не большая проблема, потому что вы просто фиксируете изменения, а затем снова перетягиваете исходный код в чистую копию.