我在proj
下的sub
文件夹中使用子树进行了monorepo项目proj/sub
。我做了很多提交,涉及proj
和sub
。如何有效地将相关更改发布到上游sub
?
通常,我必须使用
挑选每个提交 git cherry-pick -x --strategy=subtree -Xsubtree=sub/ commit-ref
但是我做了数以万计的提交,所以这是不可行的。如何将更改一次性集成到sub
?例如,创建一个大的压扁提交,将sub
置于我的monorepo中的相同状态。
相关:View commits that make changes to subfolder,How to cherry pick a range of commits and merge into another branch
答案 0 :(得分:2)
使用一些樱桃棒会有一些变化,但到目前为止,我还没有找到使用单个命令的自动方式。使用
git rebase -s subtree -Xsubtree=sub --onto sub_master proj_ini proj_end
复制到子项目主分支sub_master
所有顶级proj
提交,从ref proj_ini
(不包括)到ref proj_end
(包括)。你所在的分支并不重要。对于每次提交,可能会发生以下情况:
sub
sub
以外的文件不会显示。由于我们正在变基础,所以这些都被默默地忽略了。如果你愿意挑选这个
提交类型,将发生错误,告知空提交不是
允许(未来的Git版本可能有git cherry-pick --skip-empty
)sub
及其外部都进行了更改
使用完全相同的消息复制,但只保留相关的更改/文件,其余部分被彻底忽略proj
移动到sub
会被彻底改写为创作合并提交大多数是干净利落的,但有一些例外
5.1明确忽略您对来自proj
的{{1}}主文件所做的最新合并提交。
5.2使用cherrypick显式合并涉及冲突解决的某些合并提交(当前分支必须为sub
):
sub_master
其中git cherry-pick -x --strategy=subtree -Xsubtree=sub -m 2 merge_ref
通常为每个父母1或2。 (实际上,我会盲目地尝试其中一个和-m
并尝试另一个,如果我遇到冲突或不必要的变化)
答案 1 :(得分:1)
因为cherry-pick实际上可以接受多个commit-ishes,你可以只做git log [<options>] [<revision range>] -- sub
并将输出格式化为只打印哈希值吗?将列表输入git cherry-pick -x --strategy=subtree -Xsubtree=sub/ <list of commits>
。您是否只是尝试用较少的命令完成此任务?如果是这样,它可能会奏效,但我从未亲自完成过。