使用Git作为Git和SVN Repos之间的桥梁?

时间:2012-11-02 01:44:45

标签: git svn git-svn

问题

我的团队使用git对bitbucket进行源代码控制,我们的客户在内部使用Subversion。在将代码检入Subversion时,我们的团队如何继续使用git?而且,不,我认为git-svn不会起作用。

要求

我的团队想要使用纯git解决方案,而不是git-svn。原因是我们的客户只允许我们在办公室局域网内访问他们的svn环境;在办公室外工作时,我们不能做出承诺。

我的方法

我认为我可以使用git-svn检出subversion存储库,然后将我们的bitbucket git实例作为远程添加到同一个git-wrapped svn存储库。然后,一个cron作业可以从我们的bitbucket仓库中执行git pull,然后执行git svn dcommit将bitbucket中的更改推送到客户端的subversion存储库。

这是有问题的,因为git总是会在pull,svn dcommit进程完成后显示我在git bitbucket存储库之前的'x'版本。

虽然还没有任何外表奇怪的事情发生,但在某些时候我相信我们的客户会开始检查他们的subversion存储库,我最终必须推送到我们的bitbucket实例。

技术细节

以下是我一直在努力实现这一目标的一系列粗略步骤:

git svn clone -s http://svn.my-client.us/my-proj/
cd my-proj
git remote add origin path-to-bitbucket-repo
git fetch origin
git checkout -b develop remotes/develop
git branch --set-upstream develop origin/develop
git pull
#add merge comment here
git svn rebase
git svn dcommit #takes a while to transfer all the individual commits

完成上述所有操作后,执行git status

[me@dev myDir]$ git st
# On branch develop
# Your branch is ahead of 'origin/develop' by 59 commits.
#
nothing to commit (working directory clean)

鉴于我需要能够从任何地点办理登机手续,而不仅仅是在办公室时,是否有任何策略可以将其作为桥梁来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:4)

您的方法是正确的,但您必须意识到dcommit比普通rebase更具破坏性地重写历史记录。例如,它为每个提交附加一个git-svn-id行,该提交将被提交给svn。这就是为什么您的develop分支出现在origin/develop之前的原因 - 因为它在邮件中有59个提交,其中包含git-svn-idorigin/develop中没有这些提交。因此,您必须在每次dcommit之后或至少在下一次dcommit之前重新绑定您的git分支。这意味着强制推动重写上游的历史:

git push -f origin develop

如果任何其他分支机构都基于此上游,则现在必须对其进行重新定位。

git-svn man page的CAVEATS部分详细介绍,所以你一定要阅读它。

您的客户在svn端所做的更改将自动通过git svn rebase合并到您的开发分支中,并最终通过上面的git push -f到达bitbucket。

如果这种工作流程不能满足您的需求,那么可能值得查看SubGit。我从未尝试过,但他们声称在两个SCM之间提供的限制更少。