有没有一种方法可以使用Lerna“刷新”导入的存储库?

29

我参与了一个项目,有两个不同的代码库,我们很快将它们合并成一个组合库。在这方面,Lerna的import命令将非常有用,因此我们将保留项目历史记录。

但是,原始存储库中目前有一些正在进行中的功能分支,可能在我们转移到组合库时还没有准备好。据我所知,lerna import只会从源存储库中拉取当前检出的分支-这是否正确?

所以我想知道是否有办法再次导入,但仅拉取自上次导入以来已经进行的提交?

这样,正在处理特性分支的团队可以在准备就绪后合并到develop分支,然后我们可以将其带入组合库。

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

或者,我需要等到所有内容都合并到develop后才能执行lerna import吗?

谢谢!

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/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历史记录,但这似乎与提供详细信息的问题没有完全相关。


1
我不确定lerna在底层做了什么,但有一种手动使用git的方法。我们过去为8-10个存储库做了类似的事情。
假设我们有MonoRepo和TargetRepo:
  1. 进入MonoRepo
  2. 添加目标:git remote add target
  3. 创建feature1分支:git checkout -b feature1
  4. 合并目标分支:git merge target/feature1-branch-on-target
  5. 重复步骤3和4以获取所有所需分支。
  6. 获得利润
您可以在任何时候重复步骤3-4,在进行几次提交后,一天内完成所有操作并移动到mono repo等。

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

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