Подкаталоги Merge 2 Rails App хранят историю Git

Я хочу объединить 2 приложения Rails "мы можем вызвать источник " в другое приложение Rails "мы можем вызвать цель ", распределенные по подпапкам без потери истории git.

Я хочу объединить только основные папки рельсов.

например

объединить источник / подпапку >> цель / подпапка / источник

объединить источник / вложенную папку /file.rb >> target/ вложенную папку / источник / file.rb

source
├── app
│   ├── controllers
│   │   └── ...
│   ├── helpers
│   │   └── ...
│   ├── jobs
│   │   └── ...
│   ├── mailers
│   │   └── ...
│   ├── models
│   │   └── ...
│   └── views
│       └── ...
├── config
│   └── ...
└── test
    └── ...    

целевое приложение должно выглядеть так:

target
├── app
│   ├── controllers
│   │   ├── source
│   │   │   └── ...
│   │   └── ...
│   ├── helpers
│   │   ├── source
│   │   │   └── ...
│   │   └── ...
│   ├── jobs
│   │   ├── source
│   │   │   └── ...
│   │   └── ...
│   ├── mailers
│   │   ├── source
│   │   │   └── ...
│   │   └── ...
│   ├── models
│   │   ├── source
│   │   │   └── ...
│   │   └── ...
│   └── views
│       ├── source
│       │   └── ...
│       └── ...
├── config
│   └── ...
└── test
    ├── source
    │   └── ...
    └── ...

Я просто хочу сохранить историю мерзавцев в основной подпапке, остальные файлы я объединю вручную.

После этого поста я попробовал инструмент git git subtree и он работает только для слияния " исходного " приложения в папку цели, например библиотеки или плагины, но я хочу распределить подкаталоги исходного приложения (контроллеры, модели, помощники, представления, спецификации,...) в целевое приложение подкаталоги.

Основная цель этого - увидеть в Github всю историю файлов, импортированных из исходного приложения в целевое приложение.

2 ответа

Решение

SOL [РЕШЕНИЕ]

Наконец, я нашел решение, очень похожее на то, что предлагает matthewd, Спасибо matthewd.

Что я сделал, так это подготовил исходное приложение для его слияния с целевым приложением.

Для каждой подпапки, которую я хотел объединить, в исходном каталоге. Я сделал:

in source/ $

1) Удалите пульт дистанционного управления только для предотвращения удаленных изменений.

$ git remote rm origin

2) Фильтр репо с каталогом, который я хочу объединить (например, каталог: приложение / контроллеры)

$ git filter-branch --subdirectory-filter <directory> -- --all

3) Подготовить подпапку

$ mkdir target
$ mv * target

например, приложение / контроллеры / цель

4) Добавить и зафиксировать изменения

$ git add --all
$ git commit -a -m "Controllers added"

Затем:

in target/ $

1) Я добавил пульт, на который ссылается мой локальный каталог с предыдущими изменениями.

$ git remote add source <../target-dir>

1.1) Создать branch работать с.

$ git checkout -b new-branch

2) И pull изменения, использующие --allow-unrelated-histories на мой репо, который, если мы создали правильную подпапку, не должен иметь конфликтов.

$ git pull source master --allow-unrelated-histories

И это все, просто push изменения в вашей текущей ветке

Я бы рекомендовал следовать стратегии слияния и перемещения вместо поддерева: для меня это делает историю более ясной (и неизменной).

  1. Переместите каталоги в исходном репозитории, чтобы получить желаемую форму (удаляя файлы, которые вы не хотите передавать)
  2. Зафиксируйте это (на временной ветке, если хотите)
  3. Добавьте исходный репозиторий как удаленный в целевой проверке
  4. Объединить соответствующую ветку из источника в цель и зафиксировать
  5. Примените любую дополнительную очистку после слияния, соедините новые детали и т. Д.

На самом деле в этой стратегии нет ничего специфичного для Rails, но, поскольку мы помечены для нее, вот пример, где я недавно сделал выше: https://github.com/rails/rails/pull/32097

Другие вопросы по тегам