允许 hgsubversion SVN 克隆推迟所需的步骤

发布于 2024-10-23 00:44:27 字数 394 浏览 6 评论 0原文

我所在的团队主要使用 SVN,而我更喜欢在可能的情况下使用 Mercurial。我使用 hgsubversion 设置了 SVN 存储库的 hg 克隆,并且几个基本的拉取/提交/推送似乎运行良好。

现在,经过 2 周的本地开发(在此期间,我合并了来自外部 hg 存储库的更改,并多次合并了来自 SVN 存储库的更改),我尝试推送到 SVN 存储库,但失败了信息:

中止:抱歉,找不到合并修订版的 svn 父级。

我发现其他用户也遇到了同样的问题,并提供了如何避免此问题的方法,但我还没有遇到任何似乎可以解决压缩多个并行提交以清理现有 hgsubversion 存储库的问题。

我可以在不失去自己承诺的情况下纠正问题的最佳方法是什么? (有步骤说明吗?)

I am working on a team that uses SVN primarily, whereas I prefer to use Mercurial when possible. I set up an hg clone of the SVN repo using hgsubversion, and several basic pulls/commits/pushes seemed to function fine.

Now after 2 weeks of local development (during which time I've merged in changes from an external hg repo, and merged in changes from the SVN repo multiple times), I've attempted to push to the SVN repo, but failed with this message:

abort: Sorry, can't find svn parent of a merge revision.

I've found other users encountering the same problem, with how-tos on how to avoid this issue going forward, but I haven't encountered anything that seems to address condensing multiple parallel commits to clean up an existing hgsubversion repo.

What is the best way that I can rectify matters without losing my own commits? (With step-by-step instructions?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

探春 2024-10-30 00:44:27

您无法将 hg 合并推送到 subversion 存储库中,因为 SVN 无法理解它们。您需要在最新的 SVN 提交之上重新调整您的更改。

编辑 扁平化历史记录的步骤:

警告,做好发生大量合并冲突的准备

您需要激活 mq 和 rebase 扩展

第一步是创建一个备份存储库,因为您将需要它作为即将发生的合并冲突的参考(预计会有很多冲突)。

假设您的图表如下所示:

C1--C2--C3------M1--C5--C6--C7---M2--
  \            / \              /
   \--B1--B2--/   \--B3--B4-B5-/

那么第二步是在 C3 之上重新设置 B1+B2 的基础: hg rebase -b B2 -d C3

-b 使用公共基础两个分支作为分支变基的开始,因此 Mercurial 发现 B1 是第一个偏差提交,即使您说 B2 变基,也会使用它。
-d 指定重新基址分支的目标。

当遇到合并冲突时,请确保B2'的结果= M1,否则在后续的修改中会出现很多冲突。

之后合并 M1 消失,您的图表如下所示:

C1--C2--C3--B1'--B2'--C5'--C6'--C7'---M2'--
                   \                 /
                    \--B3'--B4'-B5'-/

现在您对第二次合并执行相同的操作:hg rebase -b B3' -d C7',这使您的存储库如下所示:

C1--C2--C3--B1'--B2'--C5'--C6'--C7'--B3''--B4''--B5''

重复直到您拥有全线性版本历史记录。

展平历史记录后,您需要在 svn 提交之上重新排序提交。
假设您的存储库现在看起来像这样(S=subversion 提交,C=本地提交):

S1--S2--S3--C1--C2--S4--S5--C3-C4--C5--C6--C7--S6--S7

现在您将所有内容从(包括)C1 导入到 Mercurial 队列中 (hg qimport -rC1:)。要查看所有创建的补丁,请使用hg qseries

然后取消应用所有补丁(hg qgoto C1.diff [这是 qseries 中的第一个补丁],然后是 hg qpop)。然后删除 subversion 版本 (hg qdelete S4.diff S5.diff S6.diff S7.diff)。

现在是重新获取 svn 提交的时候了(hg pull »svn-remote<)。然后,您使用 hg qpush 重新应用所有本地补丁,并修复所有正在发生的合并冲突。解决完一个冲突后,您可以使用 hg qfinish -a 将当前补丁移至 Mercurial 提交中,并使用 hg push »svn-remote« 发送当前状态>。

You can't push hg merges into a subversion repository, since SVN can't understand them. You need to rebase your changes on top of the latest SVN commit.

Edit Steps to flatten the history:

Warning, be prepared to do have lots of merge conflicts

You need the mq and rebase extension activated

The first step is to create a backup repo, since you will need it as a reference for the upcoming merge conflicts (expect many of them).

Say your graph looks like this:

C1--C2--C3------M1--C5--C6--C7---M2--
  \            / \              /
   \--B1--B2--/   \--B3--B4-B5-/

Then the second step is to rebase B1+B2 on top of C3: hg rebase -b B2 -d C3

-b use the common base of both branches as the start for the branch to rebase, so mercurial finds that B1 is the first deviation commit und uses this even when you say B2 to rebase.
-d specifies the destination of the rebased branch.

Wen you encounter merge conflicts then ensure that the result of B2' = M1, else you will get lots of conflicts in the following revisions.

Afterwards Merge M1 is gone and your graph looks like this:

C1--C2--C3--B1'--B2'--C5'--C6'--C7'---M2'--
                   \                 /
                    \--B3'--B4'-B5'-/

and now you do the same for the second merge: hg rebase -b B3' -d C7', which makes your repo look like this:

C1--C2--C3--B1'--B2'--C5'--C6'--C7'--B3''--B4''--B5''

Repeat until you have an all linear version history.

After you have flattened the history you need to reorder your commits on top of the svn commits.
Say your repo now looks like this (S=subversion commit, C=local commit):

S1--S2--S3--C1--C2--S4--S5--C3-C4--C5--C6--C7--S6--S7

Now you import everything from (including) C1 into a mercurial queue (hg qimport -rC1:). To view all created patches use hg qseries.

Then you unapply all patches (hg qgoto C1.diff [this is the first one in qseries], followed by hg qpop). Then you remove the subversion ones (hg qdelete S4.diff S5.diff S6.diff S7.diff).

Now is the time to re-fetch the svn commits (hg pull »svn-remote«). Then you reapply all local patches, one by one with hg qpush, and fix all merge conflicts which are now occurring. When you are done with one conflict, you can move the current patch into a mercurial commit with hg qfinish -a, and send your current state with hg push »svn-remote«.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文