27

我参与了一个项目,该项目有两个独立的存储库,我们很快就会将它们合并到一个 monorepo 中。Lerna 的import命令在这方面会很有帮助,所以我们会保留项目的历史记录。

但是,目前原始存储库中有一些正在进行中的功能分支,当我们迁移到 monorepo 时可能还没有准备好。我的理解是lerna import只会从源代码库中提取当前签出的分支 - 对吗?

所以我想知道是否有办法再次导入,但只提取自上次导入以来所做的提交?

这样,在功能分支上工作的团队develop一旦准备好就可以合并到分支中,我们可以将其带到 monorepo 中。

或者,是否有应对这种情况的策略?

还是我必须等到所有内容都合并后develop才能执行lerna import

谢谢!

4

2 回答 2

3

使用@Doğancan Arabacı 的答案和@Matt Mazzola 的评论。我能够为自己做到这一点,但我添加了自己的答案以及更多细节,以尝试给出更清晰的解释。

我也遇到了这个问题,因为lerna import如果目录存在,你只能导入一次,你不能导入。请参阅此处的代码

lerna import命令从原始存储库中获取所有提交,反转并重放它们。然而,当分支分歧时,没有办法重播这些(就像你可能使用git rebase --onto命令一样)。看到这里我觉得你可以使用git rebase或使用类似的技术来找出分支分歧的地方来扩展lerna import命令。我也觉得可能会变得混乱或需要一段时间,所以目前存在的简单方法是:

对于您要导入的每个分支:

从原始回购(简称original

  • 结帐并拉出您要导入的分支
  • 从您要导入的分支中剪切一个新分支:git checkout -b lerna-export
  • 将所有内容移动到将被导入的目录中,例如packages/originalmkdir packages && mkdir packages/original
  • 将所有文件移动到新目录中:git mv -k * ./packages/original- 您可能必须复制任何未选择的文件

然后从 Lerna 回购:

  • 将原始存储库添加为远程git remote add original ###url of repo###
  • 切换到要导入的分支git checkout -b orignal-import
  • 合并从 original 到 lerna 的分支:git merge original/lerna-export --allow-unrelated-histories
  • 如果您有任何冲突,请修复任何冲突
  • 推送到 Lerna 分支git push

导入所有分支后,您可能希望在导入所有分支后删除第二个遥控器:git remove rm original

当我推送其他作者的提交时,我的 BitBucket 实例的安全性存在一些问题,因此我不得不用 重写 git 历史记录git filter-branch,但这似乎与提供详细信息的问题并不完全相关。

于 2021-01-15T17:59:23.420 回答
1

我不确定 lerna 在引擎盖下做什么,但有手动使用 git 的方法。我们过去为 8-10 个存储库做过类似的事情。

假设我们有 MonoRepo 和 TargetRepo

  1. 转到 MonoRepo
  2. git远程添加目标
  3. git checkout -b 功能1
  4. git 合并目标/feature1-branch-on-target
  5. 对所有需要的分支重复步骤 3 和 4。
  6. 利润

您可以随时重复步骤 3-4,在几次提交后,在一天内完成所有操作,然后转到单存储库等。

于 2018-12-11T13:41:59.127 回答