我发现(与其他一些实现不同),Mercurial对它的推送过于热心 - 推送提交是一个不可编辑的提交。
我已经训练自己使用hg push -b branchawesome
或hg push -r awesomer
。但是,有时候我的手指会做一个" oops"并且所有内容 - 包括临时草案工作 - 都被推送到上游存储库。
是否存在一种可以直接阻止hg push
或需要强制使用" flag,如hg push --draft
?
我不想使用Secret Phases。尽管我已经提出了这个问题,但我们的目标是帮助/鼓励其他人具体说明推动哪些变革 - 没有会产生一个全新的概念。
答案 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"
编辑:修复了原始代码中忽略分支选项的错误。