Подкаталоги 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
изменения в вашей текущей ветке
Я бы рекомендовал следовать стратегии слияния и перемещения вместо поддерева: для меня это делает историю более ясной (и неизменной).
- Переместите каталоги в исходном репозитории, чтобы получить желаемую форму (удаляя файлы, которые вы не хотите передавать)
- Зафиксируйте это (на временной ветке, если хотите)
- Добавьте исходный репозиторий как удаленный в целевой проверке
- Объединить соответствующую ветку из источника в цель и зафиксировать
- Примените любую дополнительную очистку после слияния, соедините новые детали и т. Д.
На самом деле в этой стратегии нет ничего специфичного для Rails, но, поскольку мы помечены для нее, вот пример, где я недавно сделал выше: https://github.com/rails/rails/pull/32097