Mercurial Patch创建和使用

时间:2010-12-27 12:37:13

标签: mercurial patch

我遇到了一个问题,我“认为”只能使用补丁来解决。

我从我们的主存储库中克隆了一个项目,对它进行了一些更改(更新,删除文件以及目录和添加)。甚至没有提交这些更改。问题是,来自主存储库的项目已被删除/删除并重新创建为一个新项目(名称相同,所有目录结构都与以前相同)。我再次从主存储库中克隆了该项目,并希望将所有未提交的更改传输给它。

我仍在探索hg patch来解决这个问题。如果有人能够确认创建和添加补丁是正确的方法,那将会很有帮助,任何解释该过程的资源都会有很大的帮助。

7 个答案:

答案 0 :(得分:23)

你是对的 - 你需要一个补丁来将信息从一个存储库传输到另一个存储库(不相关的)存储库。这将起作用,因为文件是相同的,正如您所注意到的那样。

因此,要从old克隆传输未提交的更改,请执行

$ hg diff -g > uncommited.patch
$ cd ../new
$ hg patch --no-commit ../old/uncomitted.patch

这将恢复补丁中保存的信息。这包括有关在旧克隆中添加或重命名的文件的信息。

答案 1 :(得分:8)

可以使用标准Mercurial安装执行以下步骤:

  1. 提交本地存储库中的更改。请注意修订号。
  2. 使用“hg export -r REV> patch.diff”创建补丁。
  3. 克隆新存储库。
  4. 使用“hg import patch.diff”将补丁应用于新存储库。
  5. 实施例

    C:\>hg init example
    C:\>cd example
    C:\example>echo >file1
    C:\example>hg ci -Am file1
    adding file1
    
    C:\example>hg clone . ..\example2
    updating to branch default
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
    
    C:\example>rd /s/q .hg
    C:\example>hg init
    C:\example>hg ci -Am same-but-different
    adding file1
    

    此时exampleexample2具有相同的内容,但由于删除并重新初始化.hg文件夹,存储库彼此无关。

    现在进行一些更改并在其中一个存储库中提交它们,然后将它们导出为补丁:

    C:\example>echo >>file1
    C:\example>echo >file2
    C:\example>hg ci -Am changes
    adding file2
    
    C:\example>hg export -r 1 >patch.diff
    

    下面显示由于重新初始化,其他存储库无法提取更改。但是,它可以成功应用补丁:

    C:\example>cd ..\example2
    C:\example2>hg pull
    pulling from c:\example
    searching for changes
    abort: repository is unrelated
    
    C:\example2>hg import ..\example\patch.diff
    applying ..\example\patch.diff
    

答案 2 :(得分:3)

我会首先复制所有内容,以便您有一种回溯方式。

然后,在包含更改的工作副本中,我将首先删除.hg目录,然后从新的repo中复制到.hg目录中。这基本上将所有已更改的文件传输到新的repo中,而无需删除任何文件和目录。

您仍需要告知回购是否删除任何标记为遗失的文件。您还必须手动处理重命名。如果这是少量操作,则比尝试使用补丁方法更容易。

完成此操作后,提交您的更改并在必要时推送。

答案 3 :(得分:2)

似乎你想要的是补丁队列。因为你有未提交的更改,并且你想在提交之前从新的repo中提取....

$ hg qinit -c # initialize mq for your repo containing the uncommitted changes 
$ hg qnew name_of_patch # create patch that contains your uncommitted changes
$ hg qpop # resets your working dir back to the parent changeset

不用担心,您的更改在.hg / patches / name_of_patch中是安全可靠的,以便自己查看.....

$ cat .hg/patches/name_of_patch

现在拉入新的回购

$ hg pull -u http://location.of.new/repo # pull in changes from new repo update working dir

$ hg qpush # apply your uncommitted changes to new repo

如果你很幸运,你将没有合并冲突,你可以继续提交补丁......

$ hg qfinish -a # change all applied patches to changeset

然后如果你想......

$ hg push http://location.of.new/repo

如果回购无关,只需在新回购时启动补丁回购。并手动复制补丁并将其添加到.hg / patches / series文件。

假设已创建补丁。克隆新的回购

$ hg clone http://location.of.new/repo ./new_repo

init patch repo

$ cd ./new_repo && hg qinit -c

复制补丁

$ cp ../old_repo/.hg/patches/name_of_patch .hg/patches/

使用某种编辑器编辑系列文件

$ your_favorite_editor .hg/patches/series

name_of_patch   # <---put this in the series file

将补丁应用于新仓库

$ hg qpush

如果没有合并冲突,你确信它有效

$ hg qfinish -a

答案 4 :(得分:0)

如果布局相同,您只需复制所有文件(不包括.hg),然后使用hg addrem

答案 5 :(得分:0)

尝试查看MQ插件,如果我记得的话,它就是这样做的。我从来没有使用过,所以我不能说。

答案 6 :(得分:0)

如果只是将旧存储库移动/克隆到新URL,那么您只需将远程存储库更改为新存储库即可。

但是,如果它是从头开始重新创建的(即使具有相同的结构),那么我不相信Mercurial有任何内置功能可以帮助您。 Mercurial补丁引用了新存储库中不存在的特定变更集。

您可以使用合并工具执行差异并带来您所做的任何更改。

已编辑要回答评论中的问题: 克隆存储库时,您将获取整个更改历史记录的完整快照 - 以及关联的更改集ID等。

Mercurial通过更改集跟踪对存储库的更改,而不是像Subversion那样跟踪文件级别。

如果您克隆,那么您可以轻松地推送/合并到另一个也从同一来源克隆的存储库中。

如果您重新创建了存储库,则更改ID将不匹配,并且无法在Hg中合并。 此方案中唯一的选择是使用合并工具,它可以让您看到文件/文件夹结构中的不匹配。

另外:值得指出http://hginit.com/因为它(间接地)解释了其中的一部分。