Git 触及 subtree/subfolder 的提交
Git commits that touch a subtree/subfolder
我有一个 monorepo 项目 proj
使用 proj/sub
下的文件夹 sub
中的子树。我做了很多涉及 proj
和 sub
的提交。如何有效地将相关更改发布到上游 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
(包括)的提交。您所在的分支机构无关紧要。对于每次提交,可能会发生这些事情:
只涉及子项目的提交sub
将被干净地复制
只涉及 sub
之外的文件的提交将不会显示。由于我们正在变基,因此这些都被默默地忽略了。如果你愿意挑选这个
类型的提交,将发生错误,告知空提交不是
允许(未来 Git 版本可能有 git cherry-pick --skip-empty
)
对 sub
及其外部都有更改的提交
复制了完全相同的消息,但只保留了相关的 changes/files,其余的被完全忽略
Renames/moves 从 proj
到 sub
被干净地重写为创作
合并提交大多被清楚地说明,但有一些例外
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
,如果遇到冲突或不需要的更改,我会尝试另一个)
我有一个 monorepo 项目 proj
使用 proj/sub
下的文件夹 sub
中的子树。我做了很多涉及 proj
和 sub
的提交。如何有效地将相关更改发布到上游 sub
?
通常,我必须使用
挑选每个提交git cherry-pick -x --strategy=subtree -Xsubtree=sub/ commit-ref
但我已经提交了无数次,所以这是不可行的。如何立即将更改集成到 sub
?例如,创建一个大的压缩提交,使 sub
达到与我的 monorepo 中相同的状态。
相关:
因为 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
(包括)的提交。您所在的分支机构无关紧要。对于每次提交,可能会发生这些事情:
只涉及子项目的提交
sub
将被干净地复制只涉及
sub
之外的文件的提交将不会显示。由于我们正在变基,因此这些都被默默地忽略了。如果你愿意挑选这个 类型的提交,将发生错误,告知空提交不是 允许(未来 Git 版本可能有git cherry-pick --skip-empty
)对
sub
及其外部都有更改的提交 复制了完全相同的消息,但只保留了相关的 changes/files,其余的被完全忽略Renames/moves 从
proj
到sub
被干净地重写为创作合并提交大多被清楚地说明,但有一些例外
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
,如果遇到冲突或不需要的更改,我会尝试另一个)