防止'推动' (无分支名称或修订版)推送所有更改

时间:2015-12-07 05:20:27

标签: version-control mercurial push

我发现(与其他一些实现不同),Mercurial对它的推送过于热心 - 推送提交是一个不可编辑的提交。

我已经训练自己使用hg push -b branchawesomehg push -r awesomer。但是,有时候我的手指会做一个" oops"并且所有内容 - 包括临时草案工作 - 都被推送到上游存储库。

是否存在一种可以直接阻止hg push或需要强制使用" flag,如hg push --draft

我不想使用Secret Phases。尽管我已经提出了这个问题,但我们的目标是帮助/鼓励其他人具体说明推动哪些变革 - 没有会产生一个全新的概念。

1 个答案:

答案 0 :(得分:4)

首先,注意:Mercurial默认情况下不允许您在没有明确说明的情况下推送新的头/分支(您将收到一条错误消息,告诉您需要--new-branch或{{1}实际上推动你的改变)。只有在多个现有分支机构上提交时,才会意外地推动超出预期的工作。

其次,简单(但有问题)的解决方案是使用推送的别名,例如-f会更具限制性。但是,这会覆盖push命令,因此很难获得原始版本(例如,您可以通过push = push -r .执行此操作)。

最干净的方法是使用包装push命令的扩展名并提供不同的默认值。 e.g:

rawpush = !$HG --config alias.push=push "$@"

与别名不同,如果没有明确提供,则只会更改要推送的默认修订。请注意,有多种选择可能有意义。上面的代码设置为默认情况下推送from mercurial import extensions, commands testedwith = "3.5" default_push_rev = "." # alternative choices # Push the current revision, but only if it is a head # default_push_rev = ". and head()" # Push the current revisions and all revisions depending on it # default_push_rev = "descendants(.)" # Push the most recent head that follows the current revision # default_push_rev = "last(descendants(.))" # Push the tip revision (i.e. the chronologically most recent commit). # default_push_rev = "tip" # Push only public change sets # default_push_rev = "public()" def override_push(original_cmd, ui, repo, *pats, **opts): have_rev = False for opt in ["rev", "branch"]: if opts.has_key(opt) and opts[opt]: have_rev = True if not have_rev: opts["rev"] = [default_push_rev] return original_cmd(ui, repo, *pats, **opts) def uisetup(ui): extensions.wrapcommand(commands.table, "push", override_push) ,但您可能更喜欢其他选项。

另请注意,扩展名不会覆盖.命令,但如果您愿意,可以通过复制hg outgoing行并将wrapcommand替换为{{1}来轻松完成在重复的行中。

要获得原始行为,只需使用"outgoing",可能作为别名:

"push"

编辑:修复了原始代码中忽略分支选项的错误。