我有一个 monorepo 项目proj
在proj/sub
下sub
文件夹中使用子树。我已经进行了大量涉及proj
和sub
的提交。如何有效地将相关更改发布到上游sub
?
通常,我必须使用
git cherry-pick -x --strategy=subtree -Xsubtree=sub/ commit-ref
但是我已经进行了无数次提交,所以这是不可行的。如何将更改一次集成到sub
?例如,创建一个大的压扁提交,使sub
达到与我的 monorepo 相同的状态。
相关:查看对子文件夹进行更改的提交,如何挑选一系列提交并合并到另一个分支
当前解决方案:主要是变基
用几个樱桃镐进行一些变基就可以了,但到目前为止,我还没有找到使用单个命令的自动化方法。用
git rebase -s subtree -Xsubtree=sub --onto sub_master proj_ini proj_end
复制到子项目主分支sub_master
从 refproj_ini
(独占)到 refproj_end
(含)的所有顶级proj
提交。您所在的分支机构无关紧要。对于每次提交,可能会发生以下情况:
仅涉及子项目的提交
sub
将净地复制仅接触
sub
外部文件的提交将不会显示。由于我们正在变基,因此这些被默默忽略。如果你会挑选这个 提交类型,将发生错误,告知空提交不是 允许(未来的 Git 版本可能有git cherry-pick --skip-empty
)对
sub
和外部都有更改的提交将是 使用完全相同的消息复制,但仅保留相关的更改/文件,其余部分被完全忽略从
proj
重命名/移动到sub
净地重写为创作合并提交大多净地考虑,但有一些例外
5.1 显式忽略您对来自
sub
的proj
主节点所做的最新合并提交。5.2 使用樱桃选择显式合并某些涉及冲突解决的合并提交(当前分支必须
sub_master
):git cherry-pick -x --strategy=subtree -Xsubtree=sub -m 2 merge_ref
其中
-m
通常是每个父项 1 或 2。(在实践中,我会盲目地尝试其中之一git cherry-pick --abort
,如果我遇到冲突或不需要的更改,我会尝试另一个)
由于樱桃挑选实际上可以接受多个提交,您能否只做git log [<options>] [<revision range>] -- sub
并将输出格式化为仅打印哈希和? 将列表输入git cherry-pick -x --strategy=subtree -Xsubtree=sub/ <list of commits>
. 您只是想用更少的命令完成此任务吗? 如果是这样,它可能会起作用,尽管我从未亲自做过。