使用git-subtree后执行git svn rebase

时间:2014-04-28 00:52:24

标签: git svn migration git-svn git-subtree

简介

我们正在使用git-svn从Git转移到SVN。

我们有一个包含大型目录树的SVN存储库。项目使用相对路径链接到其他子项目。以下简化示例的MainProject取决于SharedProject1SharedProject2

SVN
└── trunk
    ├── MainProject 
    ├── SharedProject1
    └── SharedProject2

转到Git,我们每个项目都有一个存储库。我们将使用git-subtree处理依赖项。因此MainProject存储库的结构如下所示:

MainProject
└── Depend
    ├── SharedProject1
    └── SharedProject2

如何git - > svn move已执行

使用以下方法将每个项目克隆到Git存储库:

git svn clone http://server/svn --trunk="trunk/MainProject" MainProject
git svn clone http://server/svn --trunk="trunk/SharedProject1" SharedProject1
git svn clone http://server/svn --trunk="trunk/SharedProject2" SharedProject2

MainProject我们使用git-subtree添加SharedProject:

git subtree add --prefix "Depend/SharedProject1" path/to/SharedProject1 master --squash
git subtree add --prefix "Depend/SharedProject2" path/to/SharedProject2 master --squash

更改MainProject中的链接后,一切正常!

git svn rebase的问题

当我们的一些开发人员更新SVN存储库中的MainProject时,我想使用以下命令将更改添加到MainProject的Git存储库:

git svn rebase

但是我收到以下错误:

First, rewinding head to replay your work on top of it...
Applying: Squashed 'Depend/SharedProject1/' content from commit fdabd7b
Applying: Squashed 'Depend/SharedProject2/' content from commit 38e8c6f
...
Falling back to patching base and 3-way merge...
Auto-merging Properties/AssemblyInfo.cs
CONFLICT (add/add): Merge conflict in Properties/AssemblyInfo.cs
Failed to merge in the changes.
Patch failed at 0002 Squashed 'Depend/SharedProject2/' content from commit 38e8c6f
...
rebase refs/remotes/trunk: command returned error: 1

SharedProject1SharedProject2(但不是MainProject)都有一个文件Properties/AssemblyInfo.cs git似乎尝试合并,即使它们不在同一个文件夹中。< / p>

我做错了什么,如何让它正常工作?

1 个答案:

答案 0 :(得分:0)

我还有另一个问题,可能与您的问题有关(是的,几年过去了)。在我这边,git svn rebase试图将子对象的根直接重新建立到主项目的根中(因为该子对象没有--prefix或它确实忽略了它)。

在以下步骤之后发生:

  1. 我尝试扎根并获得错误:

'

From https://...
 ! [rejected]        trunk      -> master  (non-fast-forward)
 + 834b7b2...794c965 trunk      -> origin/trunk  (forced update)
  1. 我尝试通过删除以下内容来修复以前的错误:.git\svn\refs\remotes\origin\trunk并重新获取svn:git svn fetch(此修复程序基本上可以正常工作)
  2. git svn rebase之后,主项目的根被弄乱了,并包含子树的根。

在您的情况下,您似乎有2个子树,其中git尝试将文件两次合并到同一目录(主项目根目录)中。

我不知道为什么,但是看来git-svn要么以某种方式错过了有关子树前缀的信息,要么没有考虑到它。

要解决此问题,我必须在git push origin master:trunk之前致电git svn rebase