Version control 防止';hg-push&x27;(无分支机构名称或修订)以阻止推送所有更改

Version control 防止';hg-push&x27;(无分支机构名称或修订)以阻止推送所有更改,version-control,mercurial,push,Version Control,Mercurial,Push,我发现(与其他一些实现不同),Mercurial对其推送的内容过于热心,而推送的提交是不可编辑的提交 我已经训练自己使用hg push-b branchawesome或hg push-r awesomer。然而,有时我的手指会执行“oops”,所有东西——包括临时草稿工作——都会被推送到上游存储库 有没有一种反复无常的方法可以直接阻止hg推压,或者像hg推压--draft那样需要一个“force”标志 我宁愿不使用。不管我如何措辞这个问题,我们的目标是帮助/鼓励其他人具体说明推动了什么样的变化

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

我已经训练自己使用
hg push-b branchawesome
hg push-r awesomer
。然而,有时我的手指会执行“oops”,所有东西——包括临时草稿工作——都会被推送到上游存储库

有没有一种反复无常的方法可以直接阻止
hg推压
,或者像
hg推压--draft
那样需要一个“force”标志



我宁愿不使用。不管我如何措辞这个问题,我们的目标是帮助/鼓励其他人具体说明推动了什么样的变化,而不会产生一个全新的概念。

首先,请注意:Mercurial默认情况下不会让你在没有明确说明的情况下推动新的主管/分支机构(您将收到一条错误消息,告诉您需要
--new branch
-f
来实际推送更改)。只有在多个现有分支上进行了提交时,才会意外推送超出预期的内容

其次,简单(但有问题)的解决方案是使用别名进行推送,例如,
push=push-r。
将具有更大的限制性。但是,这会覆盖push命令,因此很难获得原始版本(例如,可以通过
rawpush=!$HG--config alias.push=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
行并在重复行中用
outgoing“
替换
push”
来轻松实现

要获得原始行为,只需使用
hg push-r'all()'
,可能作为别名:

[alias]
push-all = push -r 'all()'

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

首先,注意:默认情况下,Mercurial不允许您在没有明确说明的情况下推送新的头/分支(您将收到一条错误消息,告诉您需要
--new branch
-f
来实际推送更改)。只有在多个现有分支上进行了提交时,才会意外推送超出预期的内容

其次,简单(但有问题)的解决方案是使用别名进行推送,例如,
push=push-r。
将具有更大的限制性。但是,这会覆盖push命令,因此很难获得原始版本(例如,可以通过
rawpush=!$HG--config alias.push=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
行并在重复行中用
outgoing“
替换
push”
来轻松实现

要获得原始行为,只需使用
hg push-r'all()'
,可能作为别名:

[alias]
push-all = push -r 'all()'

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

太棒了!您可以在推送目标上添加带有(prechangegroup?)钩子的解决方案吗?该解决方案将只阻止不带参数的推送(仅推送-因为prechangegroup也会对其他事件进行文件处理,不带参数-因为它是被请求的)@LazyBadger我认为这是不可能的(除了推送到本地存储库),因为wire协议不传输该信息。您可以在扩展中触发错误(
来自mercurial import util;raise util.Abort(“推送未提供修订”)
)当然,不要将修订设置为默认值。不,我很高兴使用您的扩展(作为自然的Mercurial方式)。您能在一个常见的地方收集所有这些有用的技巧吗(我还记得自定义关键字而不是微小扩展的好例子)?如果允许我要求这样做favor@LazyBadger我一直在考虑在Bitbucket上发布一些这样的小东西,但有点不情愿,因为一旦你开始公开托管代码,人们也希望你能维护它(而在这种情况下,代码可以更容易地被其他人编辑)另外,一些代码需要进一步完善,才能在没有SO帖子的情况下工作(例如,
hg push
的帮助文本必须更正)。不过我会仔细考虑。问题是不同的分支上有多个提交。在这里的反馈之后,这似乎是一个更好地在“软”级别解决的问题,尽管这是一个有趣的解决方案(并显示定制hg是多么容易)。太好了!请您也用(prechangegroup?)添加解决方案hook-on-push-target,它将只阻止不带参数的推送(只阻止推送-因为prechangegroup也会对其他事件进行文件处理,不带参数-因为它是被请求的)@lazybacker我认为这是不可能的(推送到本地存储库除外),因为wire协议不传输该信息。您可以在扩展中触发错误(
来自mercurial import util;raise util.Abort(“未为推送提供修订”)