涉及子树/子文件夹的 Git 提交



我有一个 monorepo 项目projproj/subsub文件夹中使用子树。我已经进行了大量涉及projsub的提交。如何有效地将相关更改发布到上游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提交。您所在的分支机构无关紧要。对于每次提交,可能会发生以下情况:

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

  2. 仅接触sub外部文件的提交将不会显示。由于我们正在变基,因此这些被默默忽略。如果你会挑选这个 提交类型,将发生错误,告知空提交不是 允许(未来的 Git 版本可能有git cherry-pick --skip-empty)

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

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

  5. 合并提交大多净地考虑,但有一些例外

    5.1 显式忽略您对来自subproj主节点所做的最新合并提交。

    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>. 您只是想用更少的命令完成此任务吗? 如果是这样,它可能会起作用,尽管我从未亲自做过。

相关内容

  • 没有找到相关文章

最新更新