问题
我的团队使用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)
鉴于我需要能够从任何地点办理登机手续,而不仅仅是在办公室时,是否有任何策略可以将其作为桥梁来实现这一目标?
谢谢!
答案 0 :(得分:4)
您的方法是正确的,但您必须意识到dcommit
比普通rebase
更具破坏性地重写历史记录。例如,它为每个提交附加一个git-svn-id
行,该提交将被提交给svn。这就是为什么您的develop
分支出现在origin/develop
之前的原因 - 因为它在邮件中有59个提交,其中包含git-svn-id
,origin/develop
中没有这些提交。因此,您必须在每次dcommit之后或至少在下一次dcommit之前重新绑定您的git分支。这意味着强制推动重写上游的历史:
git push -f origin develop
如果任何其他分支机构都基于此上游,则现在必须对其进行重新定位。
git-svn
man page的CAVEATS部分详细介绍,所以你一定要阅读它。
您的客户在svn端所做的更改将自动通过git svn rebase
合并到您的开发分支中,并最终通过上面的git push -f
到达bitbucket。
如果这种工作流程不能满足您的需求,那么可能值得查看SubGit。我从未尝试过,但他们声称在两个SCM之间提供的限制更少。