&引用;git rebase<;分行>&引用;在git svn repo上更改了远程跟踪目标?

&引用;git rebase<;分行>&引用;在git svn repo上更改了远程跟踪目标?,git,svn,git-svn,Git,Svn,Git Svn,我有一个git svn回购。我在这里有多个发布分支。我正在准备一个新版本,作为其中的一部分,我想我会从上一个版本中做一个“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 r

我有一个git svn回购。我在这里有多个发布分支。我正在准备一个新版本,作为其中的一部分,我想我会从上一个版本中做一个“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 DCOMIT”之后,我差点尿裤子。这是在颠覆我的旧释放分支

为什么远程跟踪分支会因执行重基而发生更改

我该如何解决自己陷入的困境

编辑:好的,为了让自己摆脱困境,我相信我可以做到以下几点:

由于新发布分支上只有少数提交被拉到旧发布,因此我可以在SVN repo上手动分别还原它们。不过,我仍然对这里发生的事情感到困惑

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

  • 设置两个git分支,远程跟踪SVN分支
  • 查看其中一个分支
  • 运行
    git svn info
    并观察指向svn中正确位置的URL
  • 运行
    git-rebase
  • 再次运行
    git svn info
    ,观察更改后的URL指向svn中的其他分支位置

  • 看起来您在使用git svn时犯了一个常见错误

    git svn中没有“跟踪分支”这样的东西。它总是通过第一个父历史记录确定要向其提交数据的分支的URL,直到满足带有“git svn id:”签名的第一次提交。此签名附近的URL是推送提交的URL。但请注意,这里有一个双重检查:签名附近的URL和修订版与.git/svn/refs目录中的数据结构相比较,如果URL和修订版与它们相矛盾(这对于基于rebase的提交是正确的,因为rebase不涉及这些结构),则不考虑。因此,旧的分支URL是提交的第一个未重定基础的URL

    如果您想要纯粹的Git体验,您可以尝试作为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/
    

    subgit看起来确实很不错,不幸的是,我不太可能在我们的SVN服务器上安装它,太多的人依赖它,可以理解,当事情基本上“正常”时,他们会反对安装它。我应该如何做我在git svn中尝试做的事情?您可以在您的机器上安装subgit并指定--svn url,即它与git svn的要求几乎相同。使用git svn。。。我认为您可以1)签出新版本2)确保HEAD在git svn id(即新版本的URL)中具有正确URL的提交消息3)和cherry pick提交逐个删除git svn id:签名(例如,在提交之前使用“git cherry pick-n”命令并编辑消息)或通过“git filter branch”重新设置并删除它们指挥部。老实说,我不确定是否有必要删除git svn id签名,但我最好删除它们。
    $ git checkout new_release
    $ git rebase old_release
    $ git push origin new_release