【问题标题】:git-svn commits to wrong branch / how to merge svn branch via git-svngit-svn 提交到错误的分支/如何通过 git-svn 合并 svn 分支
【发布时间】:2013-01-05 13:57:56
【问题描述】:

我有一个 SVN 存储库,我使用 git-svn 签出,使用 --stdlayout 选项(当时,存储库是空的)。

然后我在 master 分支上工作了一段时间。当使用git svn dcommit 时,它会像它应该的那样将我的更改提交到https://my.host/repo/trunk

在某个时候,我用 git 创建了一个名为“算术”的分支。后来我也想在 svn 中创建那个分支,所以我按照网站的建议做了一个git svn branch arithmetics,然后是一个git branch --set-upstream arithmetics remotes/arithmetics。我想这是出了问题的地方,因为我收到了关于 --set-upstream 被弃用的警告。

当调用git svn dcommit 时,它会提交到https://my.host/repo/branches/arithmetics,到目前为止一切顺利。但后来我注意到,当我尝试将分支合并回 master 时,dcommit 将提交到该分支,而不管 git 存储库中当前签出的分支如何。

我什至尝试从 svn 创建一个新的克隆,将分支合并到那里的 master 中。我还尝试使用git checkout -b local/trunk remotes/trunk 明确检查trunk,然后将分支合并到其中,然后再合并git svn dcommit。它总是会再次提交到分支。

我该如何解决这个问题?

PS:我使用git rebase 进行合并,据我所知,git-svn 的合并提交有问题,所以我没有这些。

【问题讨论】:

  • 很容易理解 git-svn dcommit 会将更改发送到哪里:运行“git log”并查看“git-svn-id:”签名。会有将更改发送到的 URL。

标签: git svn git-svn branching-and-merging


【解决方案1】:

您不能将 git 分支 提交到 SVN 存储库,因为 Git 和 SVN 具有完全不同的分支概念。与 git 合并,然后调用 dcommit 将使您的历史线性化(与 rebase 非常相似),然后推送到当前签出的分支。

这是git svn手册页中的重要部分:

MERGE TRACKING
虽然 git svn 可以跟踪复制历史记录(包括分支和标签) 采用标准布局的存储库,它还不能代表合并 将 git 内部发生的历史记录返回给 SVN 用户。所以 建议用户在 git 中尽可能保持历史线性 以简化与 SVN 的兼容性(请参阅下面的 CAVEATS 部分)。

另外,caveats 部分有一段专门针对您的问题:

不建议在您计划的分支上运行 git merge 或 git pull dcommit from 因为 Subversion 用户看不到你的任何合并 制作。此外,如果您从一个 git 分支合并或拉取 SVN 分支的镜像,dcommit 可能会提交到错误的分支。

如果你进行合并,请注意以下规则: git svn dcommit 将尝试 在 SVN 提交之上提交

git log --grep=^git-svn-id: --first-parent -1

【讨论】:

  • 这是否意味着,我不能再从 git 合并我的 SVN 分支,因为其中的提交已提交给 svn?或者我可以更改提交的 git-svn-id 吗?
  • 我想如果你想使用 Git 来合并 SVN 分支,你必须做一个 --squash 合并,然后手动设置合并属性(这一步是可选的)。我不知道你的特定提交是否已经在 SVN 存储库中——你是唯一能找到的人(svn log、git log、git svn log……)
猜你喜欢
  • 2013-04-11
  • 1970-01-01
  • 2011-05-16
  • 2017-10-11
  • 2011-07-07
  • 2011-11-06
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多