6

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

所以我建立了我的分支......

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

然后我做了rebase ...

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 存储库上单独手动恢复它们。不过,我仍然对这里发生的事情感到困惑。

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

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

1 回答 1

9

看起来你在使用 git-svn 时犯了一个常见的错误。

git-svn 中没有“跟踪分支”之类的东西。它始终通过第一父历史记录确定要提交到的分支的 URL,直到遇到带有“git-svn-id:”签名的第一次提交。此签名附近的 URL 是提交将被推送的 URL。但请注意,有一个双重检查:将签名附近的 URL 和修订与 .git/svn/refs 目录中的数据结构进行比较,如果 URL 和修订与它们相矛盾(这对于 rebase 提交是正确的,因为 rebase 不会触及那些结构),则不予考虑。所以旧的分支 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
于 2012-12-19T17:10:16.493 回答