3

我想将 2 Rails 应用程序“我们可以调用”合并到另一个 Rails 应用程序“我们可以调用目标”分布到子文件夹中而不会丢失 git 历史记录。

我只想合并 Rails 的主文件夹。

例如

合并源/子文件夹 >> 目标/子文件夹/源

合并源/子文件夹/file.rb >> 目标/子文件夹/源/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 工具git subtree,它只能将应用程序“源”合并到目标文件夹中,如库或插件,但我想分发应用程序的子目录(控制器、模型、助手、视图,规格,...)到目标应用程序子目录。

这样做的主要目的是可以在Github中查看从应用程序导入到目标应用程序的文件的所有历史记录。

4

2 回答 2

3

✅ [解决方案]

最后我找到了一个与@matthewd提出的非常相似的解决方案,谢谢@matthewd

我所做的是准备我的应用程序将其直接合并到目标应用程序。

对于我想合并的每个子文件夹,在源目录中。我做了:

in source/ $

1)删除远程只是为了防止远程更改。

$ git remote rm origin

2) 使用我要合并的目录过滤 repo(例如目录:app/controllers)

$ 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)如果我们创建了一个正确的子文件夹,那么对我的 repo 所做pull的更改不应该有冲突。--allow-unrelated-histories

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

仅此而已,只是push对当前分支的更改

于 2018-08-02T16:02:42.827 回答
2

我建议遵循合并和移动策略而不是子树:对我来说,它使历史更清晰(并且不变)。

  1. 在源存储库中移动目录以生成您想要的形状(删除您不想带来的任何文件)
  2. 提交(如果您愿意,可以在临时分支上)
  3. 在目标签出中将源存储库添加为远程
  4. 将相关分支从源合并到目标,并提交
  5. 应用任何额外的合并后清理,将新部件连接在一起,等等。

关于该策略实际上并没有任何特定于 Rails 的内容,但是正如我们为它标记的那样,这是我最近执行上述操作的示例:https ://github.com/rails/rails/pull/32097

于 2018-08-02T13:46:32.083 回答