将本地Git存储库与主Subversion存储库一起使用

时间:2009-08-12 19:42:17

标签: svn git

我听说可以在开发人员计算机上安装本地Git存储库,同时保留存储在svn存储库中的源代码的主副本。

一个好的用例是你有一个每个开发人员都使用的中央svn存储库。一位开发人员偶尔会离线,并希望跟踪他/她在离线时所做的更改。当开发人员重新上线并可以访问svn时,他们的工作副本修改可以检入svn。当文件被检入svn时,我很好地丢失了Git本地发生的变化的历史。

有人可以概述如何最好地解决这个问题吗?像这样工作有任何陷阱吗?

4 个答案:

答案 0 :(得分:4)

您可以使用this tutorial之类的东西作为起点。我还阅读了this tutorial

这种工作方式存在一些缺陷。最重要的一点是你不能使用svn 1.5版mergeinfo,并期望通过git生存。如果你使用(可以说是相当不错的)svn 1.5合并功能,这是一个主要的缺点。

git-svn的手册页还包含您应该了解的“警告”部分下的一些注释。一旦我理解了所有警告,我就明白使用此设置的好处是低于我特定情况的实际成本。所以我用自己的精力说服项目转而使用git,这是我刚刚成功完成的事情。

答案 1 :(得分:4)

说你的SVN回购位于 svn + ssh://用户名@svn_server / svn / your_repo
并且您的SVN存储库具有“正确”布局(主干,分支,标签) 这是我几个月来一直使用的工作流程:
1.' mkdir your_repo '
2.' cd your_repo '
3.' git svn clone -s svn + ssh:// username @ svn_server / svn / your_repo。'(注意点)
4. [等待一段时间取决于你的存储库的大小:)] 现在你的GIT'主人'跟踪SVN中继线 如果你在某个分支上工作,你也可以建立一个跟git一样的跟踪分支 5.传统的 hack hack hack
6.使用' git svn fetch&&更新您的克隆git svn rebase '
7.使用' git svn dcommit '

将您的更改“推送”到svn

更好的东西
在.gitconfig中定义以下方便的别名:
1.别名' spull '代表svn-pull,如下所示:' spull =!git svn fetch&& git svn rebase '
2.别名' spush '代表svn-push,如下所示:' spush =!git svn dcommit '

这些别名将工作流程转变为纯粹的有效性: 克隆 / hack hack / spull / spush - >的利润

<强>的svn:外部对象
我无法在互联网上找到一个好的解决方案,所以自己做了一个:) http://github.com/sushdm/git_svn_externals它还不完美,但应该明确地让生活变得更加轻松。

非常适合我,希望它可以帮到你。

答案 2 :(得分:3)

我会尝试的一个解决方案是:

  1. 使用SVN从中央仓库结帐
  2. git init创建本地仓库
  3. 将.svn添加到.gitignore
  4. git add *将所有文件添加到本地仓库
  5. 用git完成所有中间分支/提交/恢复。
  6. 完成后,使用SVN返回中央仓库。

答案 3 :(得分:1)

我认为git-svn更好的用例是你被迫使用中央svn存储库,但你想亲自使用git。或者也许团队中的大多数人现在更愿意使用svn。使用git-svn,您将不会丢失在本地git存储库中提交的提交历史记录。

如果您从头开始设置新的存储库和/或可以自由选择,我会选择其中一个。 git-svn运行良好,但你总是会对抗两个系统之间的“阻抗不匹配”。

如果它只是一个您希望实现的集中模型,那么公共git存储库可以用作中央存储库。请参阅setting up a shared repository上的Git用户手册部分。