2012-11-02 48 views
5

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

我的团队使用混帐上到位桶源头控制,我们的客户使用Subversion的房子。在将代码签入Subversion的过程中,我们的团队如何继续使用git?而且,不,我不认为git-svn会起作用。

要求

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

我的做法

我以为我可以使用Git svn签的颠覆存储库中,然后加入我们的到位桶git的实例作为遥控器相同的git包裹的svn库。然后,一个cron作业可以从我们的bitbucket回购库中执行git pull,然后执行git svn dcommit将bitbucket中的更改推送到我们客户端的Subversion存储库。

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

虽然没有向外奇怪是怎么回事呢,在某一点上,我相信我们的客户将开始制作签入到我将不得不最终推到我们的到位桶比如他们的颠覆仓库。

技术细节

这里有一个粗略的一系列我一直在使用,试图得到这个工作的步骤:

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

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

鉴于我需要能够从任何位置办理登机手续,而不仅仅是在办公室时,是否有任何使用它作为桥梁来做到这一点的Trategy?

谢谢!

回答

4

您的方法是正确的,但您必须注意,dcommit比正常的rebase更具破坏性地重写历史记录。例如,它会向每个提交到svn的提交附加一个git-svn-id行。这就是为什么你develop分支出现提前origin/develop - 因为它有59所提交的所有消息中包含git-svn-id,和这些都不是出现在origin/develop。因此,在每个dcommit之后,或者至少在下一个dcommit之前,您必须重新绑定您的git分支。这意味着力推动改写上游的历史:如果任何其他部门都建立在对上游

git push -f origin develop 

,他们现在会对它被重建基础。在git-svn man page

的告诫部分进入更多细节,所以你一定要读它。

客户端在svn端进行的更改将通过git svn rebase自动纳入开发分支,并最终通过上面的git push -f到达bitbucket。

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