如何将此脚本转换为自定义mercurial命令?

时间:2017-03-22 18:55:55

标签: bash shell ssh version-control mercurial

我有以下脚本:

#!/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别名/自定义命令实现相同的目的。我可以吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

如果您不感兴趣的是实验性软件,您仍然可以将存储库标记为non-publishing。这样,即使您已经推送到存储库,也可以使用更传统的历史编辑工具,例如hg rebasehg histedithg strip。但是,如果没有evolve扩展,在一个存储库中销毁的修订将不会自动从其他存储库中消失。你必须手工剥离它们。

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

相关问题