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

ash*_*ies 6 svn git 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
Run Code Online (Sandbox Code Playgroud)

然后我做了改变...

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 ...
Run Code Online (Sandbox Code Playgroud)

在我做了"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并观察URL指向SVN中的正确位置
  4. git rebase <other_branch>
  5. git svn info再次运行并观察更改的URL以指向SVN中的其他分支位置

Dmi*_*nko 9

看起来你在使用git-svn时遇到了一个常见的错误.

在git-svn中没有"跟踪分支"这样的东西.它总是通过第一父历史确定分支的URL,直到满足第一次提交"git-svn-id:"签名为止.此签名附近的URL是将推送提交的URL.但请注意,有一个双重检查:签名附近的URL和版本与在git的/ SVN/refs目录数据结构进行比较,如果URL和版本违背他们(即用于衍合的提交真实的,因为底垫不碰那些结构),没有考虑.所以旧的分支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/
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout new_release
$ git rebase old_release
$ git push origin new_release
Run Code Online (Sandbox Code Playgroud)