【问题标题】:Mercurial diff/patch by exampleMercurial diff/patch 示例
【发布时间】:2015-07-20 15:23:15
【问题描述】:

我拥有hg 存储库的只读权限,并且正在尝试在本地开发和测试对其的更改。问题是我正在更换开发机器,并且在两台机器上陷入了一种奇怪/不正常的状态。

在我的旧机器上,我对 repo 做了很多更改,locslly。我刚刚在我的新机器上克隆了 repo,但显然它不包含我旧机器的更改。我需要一种从旧机器上的本地工作副本创建补丁/差异的方法,然后将它们应用于新机器上的本地工作副本。问题是我已经将旧机器上的更改提交 (hg commit -m "Blah") 到其上的分布式存储库。

我可以使用哪组特定命令来创建旧机器的补丁/差异,然后将其应用到新机器上的 repo?


更新

我在旧机器上提交了所有更改,然后运行hg serve,暴露http://mymachine.example.com:8000

在我的新机器上,我做了一些与旧机器不同的更改(本地),我运行 hg pull http://mymachine.example.com:8000 并得到:

myuser@mymachine:~/sandbox/eclipse/workspace/myapp$ hg pull http://mymachine.example.com:8000
pulling from http://mymachine.example.com:8000/
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 16 changes to 10 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

所以我运行hg merge

myuser@mymachine:~/sandbox/eclipse/workspace/myapp$ hg merge
abort: uncommitted changes
(use 'hg status' to list changes)

我现在该怎么办?!?

【问题讨论】:

    标签: mercurial diff


    【解决方案1】:

    你可以使用:

    $ hg diff > changes.patch
    

    要创建补丁文件,然后:

    $ patch -p1 < changes.patch
    

    在你的新机器上应用那个补丁文件。

    【讨论】:

    • 感谢@David Wolever (+1) - 请在 John Jeffries 的回答下方查看我的更新和评论...我有同样的问题要问你!再次感谢!
    【解决方案2】:

    嗯,这真是太棒了,mercurial 是一个分布式版本控制系统,您根本不需要通过任何补丁文件:只需将更改从旧机器拉到新机器:

    hg pull URL

    其中 URL 可以是任何网络 URL,也可以是 ssh-login,例如

    hg pull ssh://mylogin@old.maschine.boxhg pull path/to/old/repository/on/nfs/mount `

    您也可以使用bundleunbundle。他们创建了可以轻松导入新 mercurial 并保留所有元信息的捆绑包。

    hg bundle -r XXX --base YYY &gt; FILENAME

    其中 YYY 是您知道在新存储库中拥有的修订版。您使用 hg unbundle FILENAME 将其导入到您的新仓库中。当然,您可以通过重复 -r 参数或提供类似 -r X:Y 的变更集范围来一次捆绑多个变更集。

    最不方便的方法是通过差异或导出:

    hg export -r XXX &gt; FILENAME 或等效的hg diff -c XXX &gt; FILENAME,您需要使用patch -p1 &lt; FILENAMEhg import FILENAME 导入结果。

    【讨论】:

    • 感谢@planetmaker (+1) - 请在 John Jeffries 的回答下方查看我的更新和评论...我有同样的问题要问你!再次感谢!
    • 提交本地未提交的更改,然后执行合并。就像消息告诉你的那样:)
    【解决方案3】:

    最简单的方法是确保旧机器上的所有工作都已提交。然后从你的 repo 的基础上使用这个命令:

    hg serve
    

    在这个 repo 上创建一个简单的 http 服务器。监视器应说明它所服务的 http URL 的名称。

    在您的新机器上,只需从该 URL 拉取即可。

    一旦您取消了旧的更改,您就可以使用 ^C 停止 hg serve 进程。

    这种方法的优点是速度非常快,并且几乎适用于任何系统。 ssh 方法也很快,但除非您的系统配置为使用 ssh,否则它不会起作用。

    回答更新 OPs 更新提出了一个正交问题,即如何将从服务器中提取的更改与本地更改合并。如果您还没有这样做,请尝试消化this merge docthis one 中的信息。

    Merging 用于合并变更集。发生错误是因为您有尚未提交的本地更改,而 mercurial 无法合并。所以首先要做的是提交你的本地更改,然后你就可以合并了。

    但在合并之前,我强烈建议您合并您认为要合并的内容。要么确保只有 2 个头,要么指定要合并的头。合并时,您必须处于您希望合并的头部之一;通常最好在自共同祖先以来发生最多变化的情况下处于领先地位,因为差异更简单。

    合并后,不要忘记提交合并。 :-)

    【讨论】:

    • 关于hg serve 的优点,适用于没有 ssh 的系统。我只是不再习惯这样的系统了:)
    • 感谢@John Jeffries (+1) - 请查看我的更新...有什么想法吗?再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2011-09-18
    相关资源
    最近更新 更多