Git提交触摸子树/子文件夹

时间:2017-01-21 01:34:16

标签: git git-merge git-subtree cherry-pick monorepo

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

通常,我必须使用

挑选每个提交

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

但是我做了数以万计的提交,所以这是不可行的。如何将更改一次性集成到sub?例如,创建一个大的压扁提交,将sub置于我的monorepo中的相同状态。

相关:View commits that make changes to subfolderHow to cherry pick a range of commits and merge into another branch

2 个答案:

答案 0 :(得分:2)

目前的解决方案:主要是rebase

使用一些樱桃棒会有一些变化,但到目前为止,我还没有找到使用单个命令的自动方式。使用

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

复制到子项目主分支sub_master所有顶级proj提交,从ref proj_ini(不包括)到ref proj_end(包括)。你所在的分支并不重要。对于每次提交,可能会发生以下情况:

  1. 提交仅干净地复制子项目sub
  2. 承认只触摸sub以外的文件不会显示。由于我们正在变基础,所以这些都被默默地忽略了。如果你愿意挑选这个 提交类型,将发生错误,告知空提交不是 允许(未来的Git版本可能有git cherry-pick --skip-empty
  3. 承认对sub及其外部都进行了更改 使用完全相同的消息复制,但只保留相关的更改/文件,其余部分被彻底忽略
  4. 重命名/从proj移动到sub会被彻底改写为创作
  5. 合并提交大多数是干净利落的,但有一些例外

    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>。您是否只是尝试用较少的命令完成此任务?如果是这样,它可能会奏效,但我从未亲自完成过。