【问题标题】:"git rebase <branch>" on git svn repo changed remote tracking destination?git svn repo 上的“git rebase <branch>”更改了远程跟踪目标?
【发布时间】:2012-12-19 16:27:31
【问题描述】:

我有一个 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 &lt;other_branch&gt;
  5. 再次运行git svn info并观察URL更改为指向SVN中的另一个分支位置

【问题讨论】:

    标签: git svn git-svn


    【解决方案1】:

    看起来你在使用 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
    

    【讨论】:

    • subgit 看起来确实很不错,不幸的是,我不太可能将它安装在我们的 SVN 服务器上,太多人依赖它,并且可以理解的是,当事情基本上“工作”时不安装它。我应该如何在 git-svn 中完成我想做的事情?
    • 您可以在您的机器上安装 subgit 并指定 --svn-url ,即它与 git-svn 具有几乎相同的要求。使用 git-svn ...我认为您可以 1) 签出 new_release 2) 确保 HEAD 在 git-svn-id 中具有正确 URL 的提交消息(即 new_release 的 URL) 3) 并逐个提交cherry-pick一个删除 git-svn-id: 签名(例如,使用“git cherry-pick -n”命令并在提交之前编辑消息)或通过“git filter-branch”命令重新设置并删除它们。老实说,我不确定是否有必要删除 git-svn-id 签名,但我最好删除它们。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多