我知道这不是 hg 功能,但也许有人知道获得类似功能的方法。希望我的描述有意义:
我发现将我的主线(即默认分支)提交在补丁队列中保留几周以让它们“解决”很有用。但是,我还希望能够通过新队列创建主题分支。这两个想法是相互排斥的,因为您不能从应用的补丁开始创建新队列。听起来这样做的唯一方法是完成我的主线补丁,并从 qparent 提交开始分支队列,并通过将完成的补丁导入回 mq 来处理调整。还有其他想法吗?git 在这种工作流程上更好吗?
我知道这不是 hg 功能,但也许有人知道获得类似功能的方法。希望我的描述有意义:
我发现将我的主线(即默认分支)提交在补丁队列中保留几周以让它们“解决”很有用。但是,我还希望能够通过新队列创建主题分支。这两个想法是相互排斥的,因为您不能从应用的补丁开始创建新队列。听起来这样做的唯一方法是完成我的主线补丁,并从 qparent 提交开始分支队列,并通过将完成的补丁导入回 mq 来处理调整。还有其他想法吗?git 在这种工作流程上更好吗?
mq
具有guard
可以为您提供所需灵活性的功能,如hgbook 中所述。假设你有三个补丁:
patch-a
- 你让“解决”的主线补丁patch-b
- 一个新补丁,在 feature1 上的工作不完整patch-c
- 一个新的补丁开始 feature2你只需要在需要的地方分配一个守卫:
hg qpop -a
hg qguard patch-b +feature1
hg qguard patch-c +feature2
hg qselect feature2
hg qpush -a
此时,mq
将推送所有patch-a
未保护 ( ) 和积极保护 ( patch-c
) 补丁,跳过,patch-b
因为它有一个当前未选择的保护。始终应用不受保护的补丁程序。还有负守卫(例如hg qguard -- -feature1
),可以在选择后卫时阻止贴片的应用。
要切换到功能 1:
hg qpop -a
hg qselect feature1
hg qpush -a
请注意,如果您在补丁队列中做这么多工作,您应该经常提交队列本身以跟踪您对队列的更改(使用hg com --mq
)。
我会用“我没有尝试过,也不知道它是否会起作用,或者它是否是你想要的”来警告这个答案。
当您为存储库创建 MQ 时,它会将其创建为当前存储库中的新 Mercurial 存储库,因此您的内部结构如下所示:
.hg\
cache\
patches\
.hg\
.hgignore
patch1
patch2
series
status
store\
hgrc
...
您可以直接在补丁存储库上进行操作(事实上,如果您像我一样,您将设置某种脚本以便在该存储库上轻松工作 - 对我来说,我有mq
命令)。
由于 MQ 本身就是一个存储库,它可以被提交、拉取、推送等。理论上这可能包括分支。
一个可能的工作流程是,每当您认为自己对补丁感到满意时,您将其提交到补丁存储库:
hg qnew Patch3 -m "something"
...
hg qref
mq commit -m "happy with patch3"
请注意,这不是将补丁提交到您的主存储库,它只是存储补丁的历史记录。如果在某个时候你决定要创建一个分支,你可以这样做:
mq branch SomeBranch
hg qnew Patch4 -m "something else"
...
hg qref
mq commit -m "Committing to the new patch branch"
mq update default
该Patch4
补丁现在已经分支出来,并且不会出现在您的补丁系列中,即使在未应用列表中也是如此。
这是一个可行的解决方案,但需要在测试存储库上进行彻底测试,如果你不小心,它也可能会出错。
您可能想查看https://www.mercurial-scm.org/wiki/ChangesetEvolution。
这个工作流程很可能在 git 中稍微容易一些。