问题
我的团队使用git对bitbucket进行源代码控制,我们的客户在内部使用Subversion.在将代码检入Subversion时,我们的团队如何继续使用git?而且,不,我不认为git-svn会起作用.
要求
我的团队想要使用纯git解决方案,而不是git-svn.原因是我们的客户只允许我们在办公室局域网内访问他们的svn环境; 在办公室外工作时,我们不能做出承诺.
我的方法
我以为我可以使用git-svn检查subversion存储库,然后将我们的bitbucket git实例作为远程添加到同一个git-wrapped svn存储库.然后,一个cron作业可以git pull
从我们的bitbucket repo中执行,然后执行a git svn dcommit
将bitbucket中的更改推送到客户端的subversion存储库.
这是有问题的,因为在拉,svn dcommit进程完成后,git总是会显示我在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
Run Code Online (Sandbox Code Playgroud)
完成上述所有操作后,执行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)
Run Code Online (Sandbox Code Playgroud)
鉴于我需要能够从任何地方办理登机手续,而不仅仅是在我办公室时,是否有任何策略将其用作执行此操作的桥梁?
谢谢!
你的方法是正确的,但你必须意识到,这会dcommit
比正常情况更具有破坏性地重写历史rebase
。例如,它会git-svn-id
在每个提交到 svn 的提交中附加一行。这就是为什么你的develop
分支出现在origin/develop
- 前面,因为它有 59 个提交,所有内容都包含git-svn-id
在消息中,而这些都不存在于origin/develop
. 因此,您必须在每次 dcommit 后或至少在下一次 dcommit 之前重新设置 git 分支的基准。这意味着强制重写上游的历史:
git push -f origin develop
Run Code Online (Sandbox Code Playgroud)
如果任何其他分支基于此上游,那么它们现在必须重新基于它。
git-svn
手册页的“注意事项”部分有更多详细信息,因此您一定要阅读它。
您的客户端在 svn 端所做的更改将自动通过 合并到您的开发分支中git svn rebase
,并最终通过上述到达 bitbucket git push -f
。
如果这种工作流程不能满足您,那么SubGit可能值得一看。我从未尝试过,但他们声称在两个 SCM 之间提供了更有限的集成。