5

问题

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

要求

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

我的方法

我认为我可以使用 git-svn 检查 subversion 存储库,然后将我们的 bitbucket git 实例作为远程添加到同一个 git 包装的 svn 存储库。然后,一个 cron 作业可以git pull从我们的 bitbucket 存储库中执行,然后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

综上所述,执行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)

鉴于我需要能够从任何位置进行签到,而不仅仅是在我在办公室时,是否有任何策略可以将其用作执行此操作的桥梁?

谢谢!

4

1 回答 1

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手册页的 CAVEATS 部分更详细,因此您绝对应该阅读它。

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

如果这种工作流程不能让您满意,那么可能值得一看SubGit。我从未尝试过,但他们声称在两个 SCM 之间提供的集成要少得多。

于 2012-11-08T00:22:31.820 回答