合并 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=] 应用进入 目标 应用
我建议遵循合并和移动策略而不是子树:对我来说,它使历史更清晰(并且不变)。
- 在源存储库中四处移动目录以生成您想要的形状(删除任何您不想带来的文件)
- 提交(如果愿意,可以在临时分支上)
- 在目标签出中将源存储库添加为远程
- 将源中的相关分支合并到目标中,并提交
- 应用任何额外的 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
对当前分支的更改
我想合并 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=] 应用进入 目标 应用
我建议遵循合并和移动策略而不是子树:对我来说,它使历史更清晰(并且不变)。
- 在源存储库中四处移动目录以生成您想要的形状(删除任何您不想带来的文件)
- 提交(如果愿意,可以在临时分支上)
- 在目标签出中将源存储库添加为远程
- 将源中的相关分支合并到目标中,并提交
- 应用任何额外的 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
对当前分支的更改