保持svn存储库与git one同步

时间:2013-05-15 13:13:24

标签: git svn git-svn git-merge git-rebase

我的队友和我正在努力让我们的svn存储库与我们的git同步。 我们正在开发一个项目,我们被要求在svn存储库(由assembla.com网站托管)上共享我们的代码。 由于我们习惯使用git对我们的代码进行版本控制,因此我们决定充分利用git提供的git svn功能。 为了分享我们的所有工作并将其分成正确的分支,我们还有一个远程存储库用于git(bitbucket)。

到目前为止,我们使用git承诺的所有工作都没有给我们带来任何问题,但是在错误出现后同步svn存储库错误。

我按照这个答案Pushing an existing git repository to SVN将svn存储库连接到git one,但经过几次合并和提交后,我收到错误,我无法再拒绝更改。

现在我有一个分支,它是svn / trunk

的副本
$ git checkout -b assembla_copy -t svn/trunk
  Branch assembla_copy set up to track local ref refs/remotes/svn/trunk.
  Switched to a new branch 'assembla_copy'

$ git svn rebase svn/trunk
Current branch assembla_copy is up to date.

要与我的主分支同步,我都试图

git merge master

git rebase master

但是git rebase master开始应用自第一次提交以来的所有更改并且提供了大量的冲突(当我已经在svn / trunk中进行了这些更改时,因为在某种程度上我设法推动了一些对在线存储库的更改;我们目前正在进行更新),git merge master没问题,但是当我提交时,所有的更改都只在一个提交中汇总,其中它指出“合并分支'master'到assembla_copy “,虽然我更希望它会提交所有单独的提交(就像它在开始时一样......)。

如果我从主分支中提交,则所有提交都是分开的,但是主分支是重新分支的,因此所有具有主提交作为父分支的分支都显示为与主分支分开。

你能否向我解释一个正确的工作流程,让你拥有一个镜像git存储库的svn存储库,所有的工作都完成了(svn只是一个副本)? 您是否可以使用标准的git命令而不是复杂的bash脚本,正如我在上周搜索解决方案时在一些答案中看到的那样?

谢谢!

1 个答案:

答案 0 :(得分:8)

我正在使用以下工作流程,目标是将本地git repo作为远程SVN存储库的某种奇特的svn客户端。

  • 使用git svn clone ...初始化存储库。这使得主分支跟随SVN中继 - 在你的情况下这应该是svn / trunk。
  • 从主人创建一个本地“基线”分支:git checkout -b local。在您的情况下,这将是master
  • 开始处理本地的功能分支 - git checkout -b feature
  • 当我准备好提交远程SVN时:
    • git checkout master
    • git svn rebase - 获取SVN更新
    • 如果有任何更新,我会将它们合并到local
    • git rebase --onto master local feature - 功能分支与local基线相比所做的更改已应用于master分支
    • 将要素分支合并为主要内容:git checkout mastergit merge feature
    • git svn dcommit - 提交对SVN的更改
    • 将新功能合并到本地基线:git checkout localgit merge master - 就像其他人已向SVN提交了某些内容一样。

希望这有帮助。