Как я могу изменить путь к файлу в ряде патчей Мерзавца?

Я работаю над Мерзавцем 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, и т.д.)

14
задан mipadi 29 July 2010 в 21:52
поделиться

2 ответа

Мне кажется, вы должны иметь возможность использовать 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 '

6
ответ дан 1 December 2019 в 15:01
поделиться

Однажды мне пришлось сделать что-то очень похожее, некрасивое, но выполнимое. В итоге я сделал следующее:

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.

2
ответ дан 1 December 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: