我刚开始使用Git和Mercurial一起熟悉Git.
我广泛使用Mercurial中的mq扩展来管理本地补丁,我正在寻找Git等价物.
我应该只使用Git分支吗?或者是否有更好的方法来管理本地补丁,以便轻松应用和删除补丁?
谢谢,
我在Mercurial中应用了大型MQ补丁.发生的事情是我在我的补丁中做了qrefresh并包含了我不想包含的文件.有没有办法从我的补丁中删除这些文件的更改而不用手动编辑它?在这种情况下,如果我只是在没有MQ的情况下工作,我所要做的就是hg revert.
我习惯使用Mercurial mq扩展来维护上游的一组自定义补丁.它们可以作为除上游之外的单独存储库发布.现在在git我使用私有分支rebase,并且它运行良好,直到我想与其他人共享我的补丁.
在Mercurial中,补丁队列是一个独立的存储库,可以像往常一样发布.Bitbucket甚至提供了一个补丁队列功能,可以将它链接到父存储库.在Git中,如果我发布了一个包含我的补丁的私有分支,我就失去了再修改它们的能力(除非我破坏了合并),但补丁需要不时更新.
从我发现的另一个SO问题来看,在Git世界中,StGit被提议作为等价物mq.它在使用上类似mq,但如何使用StGit发布补丁队列?
(stg publish似乎是为了创建一个新的"合并友好"分支,而不是自己发布补丁)
在Git中发布补丁队列的其他方法有哪些?
我从Ubuntu包存储库安装了Mercurial.但是我不知道如何启用扩展(q*命令).我该怎么办?帮助表明了这一点
enabled extensions:
style  (no help text available)
我想启用mq和hgk.
此答案显示了如何降级提交到修补程序,但是如何才能将mq修补程序转换为本地更改?
这是一个最佳实践问题,我希望答案是"它取决于".我只是希望了解更多真实世界的场景和工作流程.
首先,我在谈论同一个项目的不同变化,所以请不要再使用subrepo.
假设您在hg存储库中拥有代码库.您开始处理复杂的新功能A,然后由您的可信测试人员报告复杂的错误B(您有测试人员,对吧?).
如果(修复)B取决于A,那将是微不足道的.你可以ci A然后ci B.
我的问题是当他们独立时(或至少现在看来)该怎么做.
我可以想到以下几种方式:
1和2 由@Steve Losh 的优秀博客覆盖,该博客与一个稍微相关的问题相关联.
与其他选择相比,1的一个巨大优势是,当您从处理一件事物到另一件事物时,它不需要任何重建,因为文件是物理上分离且独立的.所以它真的是唯一的选择,例如,A和/或B接触定义三态布尔的头文件,并被数千个C文件包含(不要告诉我你没有看到这样的遗留代码基础).
3可能是最简单的(在设置和开销方面),如果B是一个小的和/或紧急修复,你可以翻转A和B的顺序.但是,如果A和B接触相同的文件,它会变得棘手.如果A和B的变化在同一个文件中是正交的,那么很容易修复无法应用的补丁,但从概念上讲它仍然有点风险.
4可以让你头晕,但它是最强大,最灵活和可扩展的方式.我默认hg qinit使用,-c因为我想标记正在进行中的补丁并推送/拉取它们,但它确实需要一个概念上的飞跃才能意识到你也可以在MQ repo中进行分支.以下是步骤(mq = hg --mq):
hg qnew bugA; 为A做出改变;hg qrefmq branch branchA; hg qcihg qpop; mq up -rtip^hg qnew bugB; 为B做出改变;hg qrefmq branch branchB; hg qcihg qpop; mq up branchA; hg qpush采取这么多步骤似乎很疯狂,每当你需要切换工作时,你必须这样做hg qci; hg qpop; mq up <branch>; …
我想安排我最后的提交作为MQ补丁.所有提交都是本地的(从不推送到服务器),但并非所有本地提交都要转换.
说,我做了10次提交(从未推过),现在我希望将最后5次转换为补丁.
我该怎么做?
使用Mercurial队列扩展,我可以使用一些提交消息进行空提交,如下所示:
hg qnew patch_name -m "message"
没有Mercurial队列有没有办法做到这一点?我试过简单地说:
hg commit -m "message"
但是hg只是说"没有改变"并且没有做提交,我没有看到任何"强制"选项会覆盖它.
如果您想知道我这样做的动机:我们有测试基础设施,您可以将其推送到特殊存储库,它将触发自动测试运行.您需要在最尖端提交的提交消息中放入一个特殊字符串,该消息说明要运行哪些测试.显然,当我推送到实际的存储库时,我不希望这个字符串在那里.而不是修改提交两次(一次添加特殊字符串,第二次删除它),我会发现只添加一个空提交,然后回滚它更清洁 - 我可以用mq做到这一点,但是我想找到一种没有mq的方法.
我已经看过一些关于qfold的教程以及如何在TortoiseHg 1.x中做到这一点,但我无法弄清楚折叠补丁的按钮在2.x中的位置.在官方文件中没有提到它.有谁知道怎么做?
我最近开始使用MQ,因为我喜欢处理孤立补丁和提交而不影响回购的想法,直到变更集足够精确.在此之前,我曾经使用Mercurial的货架扩展,但发现它有点不稳定.我在MQ中仍然想要弄清楚的是如何使补丁彼此分离并且不按特定顺序应用它们,以及跨越不同的分支.这是我的正常流程 -
1.开始处理新补丁:
hg qnew fix-bug-1234 -m "fix bug 1234"
# do some work
hg qrefresh
2.获取要处理的新功能/错误:
hg qpop fix-bug-1234
hg qnew some-feature -m "implement feature X"
# some work on feature X (perhaps in a different branch)
hg qrefresh
3.此时,我想重新开始修复bugfix,并将功能放在一边.我觉得它很简单:
hg qpop some-feature
hg qpush fix-bug-1234
# wrap up bug fix
hg qfinish fix-bug-1234
# get back to work on feature
但是,MQ似乎总是使用系列中创建的最新补丁,并且无论我使用的qpop/qpush命令如何都应用它.我应该注意,我工作的文件也是完全独立的(虽然它们有时可以是相同的).
我在这里错过了什么吗?我应该用hg qqueue它吗?谢谢.
mercurial ×10
mercurial-queue ×10
git ×2
workflow ×2
commit ×1
dvcs ×1
shelve ×1
tortoisehg ×1