Git 触及 subtree/subfolder 的提交

Git commits that touch a subtree/subfolder

我有一个 monorepo 项目 proj 使用 proj/sub 下的文件夹 sub 中的子树。我做了很多涉及 projsub 的提交。如何有效地将相关更改发布到上游 sub

通常,我必须使用

挑选每个提交

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

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

相关:, How to cherry pick a range of commits and merge into another branch

因为 cherry-pick 实际上可以接受多个 commit-ishes,你能不能只做 git log [<options>] [<revision range>] -- sub 并将输出格式化为只打印哈希和?将列表输入 git cherry-pick -x --strategy=subtree -Xsubtree=sub/ <list of commits>。您是否只是想用更少的命令来完成这项任务?如果是这样,它可能会起作用,虽然我从来没有亲自做过。

当前解决方案:主要是 rebase

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

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

复制到子项目 master 分支 sub_master 所有顶层 proj 从 ref proj_ini(不包括)到 ref proj_end(包括)的提交。您所在的分支机构无关紧要。对于每次提交,可能会发生这些事情:

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

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

  3. sub 及其外部都有更改的提交 复制了完全相同的消息,但只保留了相关的 changes/files,其余的被完全忽略

  4. Renames/moves 从 projsub 被干净地重写为创作

  5. 合并提交大多被清楚地说明,但有一些例外

    5.1 显式忽略您对来自 sub.

    proj master 所做的最新合并提交

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

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

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