2013-01-05 61 views
1

我有一个SVN仓库,我用git-svn检出,使用--stdlayout选项(那时候仓库回复为空)。git-svn提交到错误的分支/如何通过git-svn合并svn分支

然后我在主分支上工作了一段时间。当使用git svn dcommit时,它会像我们应该那样svn提交我的更改到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,迄今为止这么好。但后来我注意到,dcommit将提交到该分支,无论当前在git存储库检出分支,当我尝试合并分支回到主。

我甚至尝试从svn创建一个新的克隆,将分支合并到主目录中。我也尝试用git checkout -b local/trunk remotes/trunk明确检查trunk,然后将分支合并到该分支中,然后合并git svn dcommit。它会一直致力于分支。

我该如何解决这个问题?

PS:我使用git rebase进行合并,因为我读过merge-commit与git-svn有问题,所以我没有任何这些。

+0

提交命名很容易明白的地方混帐SVN dcommit将发送更改:运行“git log”并查看“git-svn-id:”签名。将有URL发送更改。 –

回答

1

因为Git和SVN有完全不同的分支概念,所以你不能将dmitmit git分支到SVN仓库。与git合并,然后调用dcommit将线性化您的历史记录(与rebase完全相同),然后推送到当前签出的分支。

下面是从git svn手册页的重要组成部分:

MERGE TRACKING
虽然混帐SVN可以跟踪复制的历史(包括分行和标签)为 库采用标准布局,它还不能代表合并 历史发生在SVN用户的上游。因此,建议用户在git 内保持历史尽可能线性,以便与SVN兼容(请参阅下面的CAVEATS部分)。

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

运行git合并或混帐拉不建议您计划 从因为Subversion用户无法看到任何合并到dcommit分支你做了 。此外,如果你从SVN分支的镜像git分支合并或拉出,dcommit可能会提交错误的分支。

如果合并,请注意以下规则:混帐SVN dcommit将尝试 对SVN的顶部犯

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

是否意味着,我不能从git中合并我的SVN分支,因为它中的提交已经被提交给svn?或者我可以更改提交的git-svn-id? – crater2150

+0

我想如果你想使用Git来合并SVN分支,你必须做一个--squash合并,然后手动设置合并属性(这一步是可选的)。我不知道你的特定提交是否已经在SVN仓库中 - 你是唯一可以找出(svn log,git log,git svn log,...) – knittl

+0

谢谢,用--squash合并我可以修复我的回购。 – crater2150