Я работаю над Мерзавцем repo, это вытянули от SVN repo использование git svn
. Много лун назад SVN repo был создан из источника tarball исходного (восходящего) проекта. Исходный проект имел файловую структуру как следующее:
/
COPYING
README
src/
...many source files...
Однако, когда SVN repo был создан, файлы README, и т.д., были разделены, и приложение было создано с src/
как корень, таким образом, repo теперь просто похож:
/
...many source files
Я недавно преобразовал этот SVN repo в Мерзавца repo. Исходный проект находится также в Мерзавце repo, и я хотел бы начать отслеживать восходящие изменения, таким образом, я могу легко видеть то, какие пользовательские изменения были внесены (и отправьте патчи назад к исходному проекту, если применимо). Я нашел фиксацию в восходящем потоке repo, из которого был создан наш SVN repo, поэтому теперь я хотел бы применить наши изменения в той фиксации (в ответвлении). Я могу легко создать ряд использования патчей git format-patch
и примените их к клонированному восходящему потоку repo... за исключением того, что файловые структуры отличаются, таким образом, патчи больше не указывают на корректные файлы. Есть ли способ применить патчи от git format-patch
к src/
каталог в клонированном repo? (Обратите внимание, что патчи Мерзавца также имеют необходимую информацию как исходное имя автора, электронная почта и дата, которую я также хотел бы применить и не иметь, чтобы сделать вручную, т.е. путем бездельничания с GIT_AUTHOR_EMAIL
, и т.д.)
Мне кажется, вы должны иметь возможность использовать git filter-branch
для изменения путей в репо, ранее клонированном из SVN. Затем, после обновления всех путей к файлам, теперь вы можете просто использовать git format-patch
для создания патчей, которые будут применяться к репозиторию, недавно клонированному из восходящего потока.
Попробуйте:
git filter-branch --tree-filter 'mkdir src; git ls-tree --name-only $ GIT_COMMIT | xargs -I файлы mv файлы src '
Однажды мне пришлось сделать что-то очень похожее, некрасивое, но выполнимое. В итоге я сделал следующее:
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 <длинная строка команд> q
), один раз попробовать ( @q
), а затем сделать это для весь файл ( 999 @ q
).
Сохраните файл, перейдите в другой репозиторий Git и попробуйте git am
it.