你如何重组git-svn分支并保持元数据完好无损?

时间:2011-06-16 00:35:57

标签: git git-svn git-branch

我最近使用git svn branch创建了一个分支(在Subversion和git中)。

我注意到了(由于某些原因我不确定;也许是一个错误或者我错误地创建了分支?)分支创建的git commit有两个父母:当时在树顶部有一个我创建了分支(因为我从先前的修订版中分支出来而不正确)和一个(预期的)上一版本。

这个“第二个父母”给我带来了各种各样的悲伤,因为我现在正试图从另一个分支合并到新的分支,而git对共同祖先的看法是错误的。

我发现this question解释了如何通过使用rebase强制git分支拥有正确的父级。问题是,rebase只影响我的本地分支HEAD,而不是绑定到git-svn存储库的远程。通常,这将是一件非常糟糕的事情,但由于我是唯一一个使用这个git-svn存储库的人,我不在乎:我只想将远程分支移动到调整后的提交。

所以我的问题是:现在我已经得到了本地分支的父级指向它分支的正确提交,有没有办法让我将远程分支移动到同一个HEAD,这样我就可以(例如)运行git svn rebase而不会混淆? (我担心如果我手动更改它,.git/refs/remotes/<mybranch>/.rev_map...文件将不再与SVN匹配......?)


编辑:要解决评论中提出的问题,是的,检查分支。我要改变我的分支名称以保护无辜,但让我们想象它看起来像这样:

$ git branch
* git_mysvnbranch
  git_releasebranch
  master

$ git branch -r
  trunk
  mysvnbranch
  releasebranch

现在,当我创建分支时,mysvnbranch有两个主干的父级,以及我从中分支的任意点。现在我想要releasebranch并将其合并到mysvnbranch,这是我看到问题的时候。如果我启动gitk,它看起来像这样:

o [git_mysvnbranch] [remotes/mysvnbranch]
|\ <--- bad pointer here
| o [remotes/trunk]
| |
| o 
| | o [git_releasebranch] [remotes/releasebranch]
| | |
| o o
| |/
| o
| |
| o
| |
| o
|/
o [arbitrary branch point]

如果我想在[remotes/releasebranch]中合并,您可以看到问题。如果我做了一个rebase,我可以看起来像这样:

o [git_mysvnbranch]
|
| o [remotes/mysvnbranch]
| |\ <--- bad pointer here
| | o [master] [remotes/trunk]
| | |
| | o 
| | | o [git_releasebranch] [remotes/releasebranch]
| | | |
| | o o
| | |/
| | o
| | |
| | o
| | |
| | o
| |/
|/
o [arbitrary branch point]

现在我想要删除带有错误父级的[remotes/mysvnbranch]版本,并指出[git_mysvnbranch]指向的位置。

但是我发现这是一个奇怪的事情:svn元数据可能确实完好无损。我刚刚这样做了:

$ git svn rebase -n
Remote Branch: refs/remotes/mysvnbranch
SVN URL: svn://subversionrepo/branches/mysvnbranch

所以也许我什么都不担心。我会再测试一下,试图找出答案。


编辑2 :我不担心什么。一旦我从重新分支的分支中尝试git svn rebase,它就会尝试重新合并已经合并到git分支的更改。

1 个答案:

答案 0 :(得分:0)

经过多次痛苦和痛苦之后,我找到了一个解决方法,但这不是一个很好的方法:

$ svn copy -r <arbitrary-branch-point> svn://subversionrepo/trunk \ 
                                       svn://subversionrepo/branches/mysvnbranch2

也就是说,我放弃了并以不同的名字重新创建了分支。 (使用Subversion客户端,只是为了安全。)然后我做了git svn fetch --all。我想我能够将我的工作重新安排到新的分支上并称之为一天。当我检查gitk时,新分支基于正确的修订。

我希望有人知道更好的解决方法,因为我认为这对于遇到同样问题的每个人都不会接受。

仅供参考,我认为发生这种情况是因为在我开始此操作之前,创建了一个具有相同名称的分支,然后将其删除。这可能与git-svn混淆了。