【问题标题】:Is there a way to "refresh" an imported repository with Lerna?有没有办法用 Lerna“刷新”一个导入的存储库?
【发布时间】:2018-09-30 12:03:29
【问题描述】:

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

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

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

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

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

或者我是否必须等到所有内容都合并到develop 后再执行lerna import

谢谢!

【问题讨论】:

    标签: javascript git lerna


    【解决方案1】:

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

    我也遇到过这个问题,lerna import 只允许你导入一次,如果目录存在你不能导入。 See code here.

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

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

    来自原始仓库(简称original

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

    然后从 Lerna 回购:

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

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

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

    【讨论】:

      【解决方案2】:

      我不确定 lerna 在底层做什么,但有手动的方式用 git 来做。过去我们为 8-10 个存储库做过类似的事情。

      假设我们有 MonoRepo 和 TargetRepo

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

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

      【讨论】:

      • 我不明白这些命令是如何工作的。您声称“我们过去为 8-10 个存储库做过类似的事情。”但是当我尝试时它不起作用。我看到的 3 个问题: 1. 它不像 lerna import 那样重放提交。 2. 默认合并,不能合并不相关的历史。 lerna 导入的历史记录将不同于目标存储库的功能分支。 3. 它不处理来自单一仓库和目标仓库的不同文件夹结构。单声道在 ./packages/target 有项目,在它的根目录下有目标 repo 帽子 ./ 所以合并可能不明智
      • 此技术可能有用的另一个原因是如果您想导入多个分支。我的理解是 lerna 导入目前仅替换您提供的 git repo 路径中当前签出的分支,但是,如果有多个分支,您会被卡住并且可能需要在病房后手动添加它。经过更多的实验,我发现在构建合并之前更正目标的文件夹路径并使用标志--allow-unrelated-histories 确实允许合并工作;然而,由于历史是不相关的 git 将所有更改视为冲突
      • 这个答案需要更多澄清才能获得更多支持。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2016-12-31
      • 2016-04-19
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多