Мне приходилось делать что-то очень похожее, некрасиво, но это было управляемо. Я закончил тем, что сделал:
git format-patch <commitish> --stdout > patches-for-upstream.mbox
$EDITOR patches-for-upstream.mbox
Внутри редактора я посмотрел, какие биты были общими и нужными были изменены, чтобы заставить "git am" делать то, что я хотел. Это оказалось три строки на файл, зафиксированный в каждом коммите:
- строка, начинающаяся с
diff --git a/path/to/file b/path/to/file
- строка, начинающаяся с
--- a/path/to/file
- строка, начинающаяся с
+++ b/path/to/file
На этом этапе редактору необходимо пройти через такие строки и внести необходимые изменения, чтобы все патчи применились к другому репозиторию Git.
Я сделал это в Vim, используя три быстро набираемых макроса, YMMV. Что-то вроде:
- перейти к следующей строке, начиная с
diff --git a/
- перейти к этому слешу после
a
- измените путь так, как вам нужно, чтобы он был
- перейти к слешу после
b/
(перейти к следующему пробелу из файла a
, затем /
)
- изменить путь так же, как
- следующая строка (
---
)
- перейти к
a/
- изменить путь
- следующая строка (
+++
)
- перейти к
b/
- изменить путь
Повторяйте, пока файл не будет готов. В Vim речь шла о том, чтобы один раз вставить его в макрос (qq<long string of commands>q
), попробовать один раз (@q
), а затем сделать это для всего файла (999@q
).
Сохраните файл, зайдите в другой репозиторий Git и попробуйте git am
его.