合并两个Rails应用的子目录,保留Git历史记录。

3
我希望将两个Rails应用程序“我们可以称之为”合并到另一个Rails应用程序“我们可以称之为目标”中,而不会丢失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历史记录,其余文件我会手动合并。根据这篇文章,我尝试使用git subtree工具,但它只能将应用程序“源码”合并到目标文件夹(例如库或插件)中,而我想将源码应用程序的子目录(控制器,模型,帮助程序,视图,规范等)分发到目标应用程序子目录中。
此举的主要目的是可以在Github中查看从源码应用程序导入到目标应用程序的所有文件的历史记录。
2个回答

3

✅ [解决方案]

最终,我找到了一个非常类似于@matthewd提出的解决方案,感谢@matthewd

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

对于每个我想要合并的子文件夹,在源文件夹中,我执行了以下操作:

in source/ $

1) 为了防止远程更改,请删除远程。

$ git remote rm origin

2) 使用我想要合并的目录过滤存储库 (例如,目录: app/controllers)

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

3) 准备子文件夹

$ mkdir target
$ mv * target

例如,应用程序控制器的路径为app/controllers/target

4)添加并提交更改

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

然后:

in target/ $

1)我已经在之前的更改中将远程引用添加到了本地目录。

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

1.1) 创建一个分支来进行工作。

$ git checkout -b new-branch

2) 使用 --allow-unrelated-histories 命令将更改 pull 到我的存储库中。如果我们创建了正确的子文件夹,则不应该存在冲突。

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

就这样,只需将更改push到当前分支


2
我建议采用合并和移动策略而不是子树:对我来说,它可以保持历史记录更清晰(且不变)。
步骤如下:
  1. 在源代码库中移动目录以产生所需的形状(删除您不想带过去的任何文件)
  2. 提交该更改(如果需要,可以在一个临时分支上)
  3. 将源代码库添加为目标检出的远程仓库
  4. 将源代码库中相关分支合并到目标检出中,并提交
  5. 应用任何额外的后合并清理,连接新部分等。
这种策略与Rails无关,但由于我们被标记了,以下是最近我执行以上操作的示例:https://github.com/rails/rails/pull/32097

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接