我遇到了一个问题,我“认为”只能使用补丁来解决。
我从我们的主存储库中克隆了一个项目,对它进行了一些更改(更新,删除文件以及目录和添加)。甚至没有提交这些更改。问题是,来自主存储库的项目已被删除/删除并重新创建为一个新项目(名称相同,所有目录结构都与以前相同)。我再次从主存储库中克隆了该项目,并希望将所有未提交的更改传输给它。
我仍在探索hg patch
来解决这个问题。如果有人能够确认创建和添加补丁是正确的方法,那将会很有帮助,任何解释该过程的资源都会有很大的帮助。
答案 0 :(得分:23)
你是对的 - 你需要一个补丁来将信息从一个存储库传输到另一个存储库(不相关的)存储库。这将起作用,因为文件是相同的,正如您所注意到的那样。
因此,要从old
克隆传输未提交的更改,请执行
$ hg diff -g > uncommited.patch
$ cd ../new
$ hg patch --no-commit ../old/uncomitted.patch
这将恢复补丁中保存的信息。这包括有关在旧克隆中添加或重命名的文件的信息。
答案 1 :(得分:8)
可以使用标准Mercurial安装执行以下步骤:
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
此时example
和example2
具有相同的内容,但由于删除并重新初始化.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/因为它(间接地)解释了其中的一部分。