git svn repo上的“git rebase <branch>”改变了远程跟踪目的地?</branch>

时间:2012-12-19 16:27:32

标签: git svn git-svn

我有一个git svn repo。我在这里有多个发布分支。我正在准备一个新的版本,作为其中的一部分,我想我会从之前的版本中做一个“git rebase”来完成任何尚未合并的更改。

所以我设立了分支......

git branch new_release remotes/svn-branches/new_release
git branch old_release remotes/svn-branches/old_release

然后我做了改变......

git checkout new_release
git rebase old_release
# watch it pull a bunch of commits
git svn dcommit
    Committing to https://svn.mysvn.net/repo/releases/old_release ...

在我做了“svn dcommit”之后,我几乎扯掉了裤子。它正在Subversion中使用旧的发布分支!

为什么远程跟踪分支因进行rebase而改变?

我如何解决我自己陷入的局面?

编辑:好的,为了让自己离开,我相信我可以做到以下几点:http://svnbook.red-bean.com/en/1.5/svn.branchmerge.basicmerging.html#svn.branchmerge.basicmerging.undo

由于new_release分支上只有少数提交被拉到old_release,我可以在SVN repo上单独手动还原它们。我仍然对这里发生的事感到困惑。

EDITx2:是的,这里有一些验证步骤。

  1. 设置两个git分支,远程跟踪SVN分支
  2. 查看其中一个分支
  3. 运行git svn info并观察网址指向SVN中的正确位置
  4. 运行git rebase <other_branch>
  5. 再次运行git svn info并观察更改的URL以指向SVN中的其他分支位置

1 个答案:

答案 0 :(得分:9)

在使用git-svn时,您似乎犯了一个常见的错误。

没有&#34;追踪分支&#34;在git-svn中。它总是通过第一父历史确定分支的URL,直到第一次使用&#34; git-svn-id:&#34;签名符合。此签名附近的URL是将推送提交的URL。但是请注意,有一个双重检查:签名附近的URL和修订版与.git / svn / refs目录中的数据结构进行比较,如果URL和修订版与它们相矛盾(对于重新提交的提交也是如此,因为rebase没有&# 39;触摸那些结构),不予考虑。因此,旧的分支URL是第一个没有重新定位的提交URL。

如果您想要纯粹的Git体验,可以尝试SubGit作为git-svn替换。从2.0开始,它允许创建SVN存储库的可写纯Git镜像,注意同步和并发。运行

$ subgit configure --svn-url <SVNURL> project.git
$ #adjust projectX.git/subgit/{config,authors.txt,passwd} 
$ subgit install project.git
$ git clone project.git project/

安装后,您可以将其用作普通的Git存储库。所以对于你的例子你运行:

$ git checkout new_release
$ git rebase old_release
$ git push origin new_release