合并 2 Rails 个保留 git 历史记录的 App 子目录

Merge 2 Rails App subdirectories keeping git history

我想合并 2 Rails 应用程序 "we can call source" 到另一个 Rails 应用程序 "we can call target" 分布到子文件夹中而不丢失 git 历史记录。

我只想合并 rails 的主要文件夹。

例如

合并source/subfolder >> target/subfolder/source

合并source/subfolder/file.rb >> target/subfolder/source/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 历史记录,我将手动合并其余文件。

在这个 post here 之后,我尝试了 git 工具 git subtree,它只适用于合并应用程序“source" 放入 target 的文件夹中,例如库或插件,但我想分发 source 应用程序的子目录(控制器、模型、 helpers, views, specs, ...) 进入 target app 子目录。

这个的主要objective是可以在Github中看到从source[=导入的文件的所有历史记录45=] 应用进入 目标 应用

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

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

关于该策略实际上没有任何 Rails 的具体内容,但由于我们被标记为它,下面是我最近执行上述操作的示例:https://github.com/rails/rails/pull/32097

✅ [解决方案]

最后我找到了一个与 @matthewd propose, Thanks @matthewd 非常相似的解决方案。

我所做的是准备我的 source 应用程序,将其直接合并到 target 应用程序。

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

in source/ $

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

$ git remote rm origin

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

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

3) 准备子文件夹

$ mkdir target
$ mv * target

例如app/controllers/目标

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 对当前分支的更改