我只读了hg
repo的权限,并尝试在本地开发和测试对它的更改。问题是我正在改变开发机器,并且在这两台机器上陷入了一种奇怪/尴尬的状态。
在我的旧机器上,我对回购做了很多改动,很明显。我刚刚在我的新机器上克隆了回购,但显然它并不包含我旧机器的更改。我需要一种方法从我的旧机器上的本地工作副本创建补丁/差异,然后将它们应用到我的新机器上的本地工作副本。问题是我已经将我的旧机器上的更改(hg commit -m "Blah"
)提交给它上面的分布式仓库。
我可以使用哪些特定命令来创建旧机器的补丁/差异,然后将其应用到我的新机器上的仓库?
我在旧计算机上提交了所有更改,然后运行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)
我现在该怎么办?!
答案 0 :(得分:2)
嗯,这实际上很棒,mercurial是一个分布式版本控制系统,您根本不需要通过任何补丁文件:只需将更改从旧机器拉到新机器:
hg pull URL
其中URL可以是任何网络URL,也可以是ssh-login,例如
hg pull ssh://mylogin@old.maschine.box
或hg pull path/to/old/repository/on/nfs/mount
`
或者,您也可以使用bundle
和unbundle
。他们创建了可以轻松导入新mercurial的包,并保留所有元信息。
hg bundle -r XXX --base YYY > FILENAME
其中YYY是您在新存储库中拥有的修订版。您可以使用hg unbundle FILENAME
将其导入新的仓库。当然,您可以通过重复-r参数或提供类似-r X:Y
的变更集范围来一次捆绑多个变更集。
最不舒服的方法是通过差异或导出:
hg export -r XXX > FILENAME
或等效hg diff -c XXX > FILENAME
,您需要使用patch -p1 < FILENAME
或hg import FILENAME
导入结果。
答案 1 :(得分:2)
最简单的方法是确保旧机器上的所有工作都已提交。然后在您的仓库基础上使用此命令:
hg serve
在此repo上创建一个简单的http服务器。监视器应说明它所服务的http URL的名称。
在您的新计算机上,只需从该网址提取。
一旦您撤消了旧的更改,您就可以使用^ C停止hg服务流程。
这种方法的优点是它非常快,而且几乎适用于任何系统。 ssh方法也很快,但除非你的系统配置为使用ssh,否则它不会工作。
回答更新 OP更新正在询问有关如何将从服务器提取的更改与本地更改合并的正交问题。如果您还没有这样做,请尝试消化this merge doc和this one中的信息。
合并用于合并变更集。发生错误是因为您有本地更改尚未提交,且mercurial无法合并。因此,首先要做的是提交本地更改,然后就可以合并了。
但在合并之前,我强烈建议您合并您认为合并的内容。要么确保只有2个头,要么指定要合并的头。合并时,你必须在你希望合并的一个头上;自从共同的祖先以来,通常更好地处于最大变化的头部,因为差异更简单。
合并后,不要忘记提交合并。 : - )
答案 2 :(得分:1)
您可以使用:
$ hg diff > changes.patch
要创建补丁文件,请:
$ patch -p1 < changes.patch
在新计算机上应用该补丁文件。