2

我有一个proj使用子树的 monorepo 项目,该项目sub位于proj/sub. 我已经做出了大量涉及proj和的提交sub。如何sub有效地将相关更改发布到上游?

通常,我必须使用

git cherry-pick -x --strategy=subtree -Xsubtree=sub/ commit-ref

但是我已经提交了无数次,所以这是不可行的。如何将更改集成到sub一次?例如,创建一个大的压缩提交,它会带入sub我的 monorepo 中的相同状态。

相关:查看对子文件夹进行更改的提交如何挑选一系列提交并合并到另一个分支

4

2 回答 2

3

当前解决方案:主要是变基

用几个cherrypicks进行一些rebase就可以了,但到目前为止我还没有找到使用单个命令的自动化方法。利用

git rebase -s subtree -Xsubtree=sub --onto sub_master proj_ini proj_end

sub_master将所有顶级proj提交从 ref proj_ini(不包括)复制到子项目主分支上 ref proj_end(包括)。您所在的分支机构无关紧要。对于每次提交,可能会发生以下情况:

  1. 仅涉及子项目的提交sub将被干净地复制

  2. 仅涉及外部文件的提交sub不会显示。由于我们正在变基,因此这些都被默默地忽略了。如果您选择这种类型的提交,则会出现一个错误,告诉您不允许空提交(未来的 Git 版本可能会有git cherry-pick --skip-empty

  3. 对其内外都有更改的提交sub将使用完全相同的消息复制,但只保留相关的更改/文件,其余的被完全忽略

  4. 重命名/从proj到移动sub被干净地重写为创作

  5. 合并提交大部分都是干净的,但有一些例外

    5.1 明确忽略您对proj来自sub.

    5.2使用cherrypick显式合并某些涉及冲突解决的合并提交(当前分支必须是sub_master):

     git cherry-pick -x --strategy=subtree -Xsubtree=sub -m 2 merge_ref
    

    每个-m父母通常是 1 或 2。git cherry-pick --abort(在实践中,如果我遇到冲突或不需要的更改,我会盲目地尝试其中一个,然后再尝试另一个)

于 2017-02-26T02:20:08.640 回答
2

因为cherry-pick实际上可以接受多个提交,你可以只做git log [<options>] [<revision range>] -- sub输出并将输出格式化为只打印散列和吗?将列表输入git cherry-pick -x --strategy=subtree -Xsubtree=sub/ <list of commits>. 你只是想用更少的命令来完成这个任务吗?如果是这样,它可能会起作用,尽管我从未亲自做过。

于 2017-01-25T04:47:22.650 回答