有没有办法用 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“刷新”一个导入的存储库?的主要内容,如果未能解决你的问题,请参考以下文章