有没有办法用 Lerna“刷新”一个导入的存储库?

Posted

技术标签:

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

【参考方案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

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

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

【讨论】:

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

以上是关于有没有办法用 Lerna“刷新”一个导入的存储库?的主要内容,如果未能解决你的问题,请参考以下文章

在单存储库中使用 Lerna 对多个 Node 应用程序进行 Dockerizing

如何将分叉的 lerna 存储库的子包安装为节点依赖项?

允许本地项目依赖本地 lerna 包

无法导入私有 gitlab 存储库 [重复]

存储库中的文件阻止 IntelliJ 使用星形导入

Lerna bootstrap 不链接本地依赖项?