【问题标题】:Using Mercurial, is there an easy way to diff my working copy with the tip file in the default remote repository使用 Mercurial,是否有一种简单的方法可以将我的工作副本与默认远程存储库中的提示文件进行比较
【发布时间】:2024-01-16 18:31:01
【问题描述】:

使用 mercurial 时,我希望能够将文件的工作副本与默认远程存储库中的提示文件进行比较。有没有简单的方法可以做到这一点?

我知道我可以执行“hg incoming -p”来查看即将到来的补丁集更改,但是如果我这样做的话,直接查看特定文件的实际更改会很好最新的东西(或者我可能想要推出的东西)。

我现在能想到的最简单的事情是创建一个小脚本,查看 .hg/hgrc 中的默认位置并使用 curl 下载文件(如果它通过 http,否则通过 ssh scp,或者如果它在本地文件系统上,只需进行直接比较),然后将工作副本或提示与该临时副本进行比较。

我正在尝试向我的团队推销 mercurial,我的一位团队成员今天提出了这一点,因为他们可以使用他们的 GUI 工具在 SVN 中轻松完成。

【问题讨论】:

    标签: svn http mercurial diff scp


    【解决方案1】:

    经过一番挖掘,我发现了Rdiff extension,它可以满足我的大部分需求。

    mercurial 没有自带,但是可以通过克隆仓库来安装:

    hg clone http://hg.kublai.com/mercurial/extensions/rdiff 
    

    然后修改你的 ~/.hgrc 文件来加载扩展:

    [extensions] 
    rdiff=~/path/to/rdiff/repo/rdiff.py
    

    这有点奇怪,因为它实际上通过检测第一个参数是否是远程 URL 来修改现有的“hg diff”命令。如果是,那么它将将该文件与本地存储库中的提示文件(而不是工作副本)进行比较。这是因为远程仓库首先出现在参数中,这与我的预期相反,但您可以将“--reverse”传递给 hg diff 命令来切换它。

    我可以看到这些是对扩展的潜在增强,但现在,我可以在我的启动文件中使用 bash/zsh shell 函数来解决它们。它对我的工作副本进行临时签入(由 mercurial 事务持有,因此可以回滚),执行反向差异,然后回滚事务以将事物恢复到原来的状态:

    hgrdiff() {
        hg commit -m "temp commit for remote diff" && 
        hg diff --reverse http://my_hardcoded_repo $* &&
        hg rollback      # revert the temporary commit
    }
    

    然后调用它:

    hgrdiff <filename to diff against remote repo tip>
    

    【讨论】:

    • mercurial-extensions-rdiff 链接已失效。
    【解决方案2】:

    您可以尝试在本地拥有两个存储库 - 一个用于传入的内容,一个用于传出。然后你应该能够使用任何工具进行差异化。见这里:

    http://weblogs.java.net/blog/kohsuke/archive/2007/11/using_mercurial.html

    【讨论】:

      【解决方案3】:

      要扩展 Lars 方法(由于某种原因注释不起作用),您可以使用 diff 命令上的 -R 选项来引用本地存储库。这样您就可以使用在 hg 中指定的相同差异应用程序

      【讨论】:

        【解决方案4】:

        使用模板可以获得所有更改文件的列表:

        hg incoming --template {files}
        

        【讨论】:

          最近更新 更多