【问题标题】:How to convert this script into a custom mercurial command?如何将此脚本转换为自定义的 mercurial 命令?
【发布时间】:2017-03-22 18:55:54
【问题描述】:

我有以下脚本:

#!/bin/bash

if [ $# -ne 2 ]; then
        echo -n "$0 - a utility for applying uncommitted changes to a "
        echo "remote hg repository locally also"
        echo "Usage: $0 user@hostname path/to/repository"
        exit -1
fi
user_at_hostname="$1"
remote_path="$2"

ssh "$user_at_hostname" hg -R "$remote_path" diff | hg import --no-commit -

这不是最精彩的一段代码,可以这么说,我宁愿做一些更“善变”的事情。具体来说,我想知道是否可以使用 mercurial alias / custom 命令来实现相同的目的。可以吗?

PS - 我也考虑过在远程存储库上发出某种搁置命令,而不是仅仅获得差异,但我不想让事情变得太复杂。

【问题讨论】:

    标签: bash shell ssh version-control mercurial


    【解决方案1】:

    如果您只想将此脚本转换为 hg foo 命令而不更改它,请使用 shell alias。只需复制最后一行并将自定义变量替换为$1$2

    如果您想让它看起来更像一个“正常”的 Mercurial 工作流程,您可以先提交更改,然后拉取它们。我想您正在避免此工作流程,以便您可以改变对这些修改的想法,而不会因“oops”提交而污染存储库的历史记录。如果是这种情况,那么您可能会对Evolve extension 感兴趣。 Evolve 扩展旨在为共享可变历史提供一个安全且行为合理的系统。这样,您可以提交更改;与另一个存储库共享它;修改、变基、压缩或以其他方式修改更改;然后与相同的存储库或不同的存储库共享修改后的变更集。您还可以从历史中修剪变更集并分享您修剪它们的事实。如果此共享导致问题,例如修改具有后代的提交,Mercurial 将检测这些问题并提供修复(例如,将后代重新定位到新版本的提交),您可以使用 hg evolve 自动执行。虽然该扩展仍处于试验阶段,但它基本上适用于大多数简单的用例。

    如果您对实验性软件不感兴趣,您仍然可以将存储库标记为 non-publishing。这将允许您使用更传统的历史编辑机制,例如 hg rebasehg histedithg strip,即使您已推送到存储库。但是,在一个存储库中被销毁的修订不会自动从其他存储库中消失,而无需进化扩展。你必须用手剥掉它们。

    最后,请注意hg push --force 不会破坏修订。它创建新的匿名分支,通常会导致混乱的历史记录,但实际上不会丢失任何数据。它在这种方式上与git 不同。

    【讨论】:

    • 我没有完全按照你的第一段。你的意思是我应该在最后一行使用 shell 别名而不使用 .hgrc 别名?
    • 您应该使用.hgrc 别名,特别是可以运行任意shell 命令的那种。这些被称为“shell 别名”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多