如果在没有git-svn的情况下在SVN和Git之间使用共享存储库,是否有任何问题?

时间:2013-04-26 02:55:13

标签: git svn gerrit

背景

在我们的分布式开发团队中,我们有一个远程放置的集中式SVN存储库,用于提交源代码的多个团队。为了提高本地性能,我们决定使用 Gerrit (当然是Git而不是SVN)进行代码审查,因此我们将Git的主设备设置为与远程SVN互操作的“HUB”库中。

问题

通常,此问题的解决方法是git-svn。但是,通过git-svn克隆的分支具有不同的文件夹结构,而不是传统的“.git”,Gerrit无法识别。

目前的解决方法

所以我们采用一种看起来有点幼稚的手段..

  1. 查看远程SVN存储库。
  2. 在与SVN工作副本完全相同的目录中,git克隆对应的git存储库。所以在这个目录中除了“.svn”之外还有一个“.git”。

    $ svn co http://remote.svn.repository/some_project

    $ cd some_project

    $ git clone --no-checkout git_reop ./tmp

    $ mv ./tmp/.git ./ # Move .git directory to SVN working copy.

    $ rm -rf ./tmp

    $ git reset --hard HEAD # This is tricky to tell git I want to use this directory as unstaged.

  3. 问题

    如果在SVN和Git之间使用共享存储库,是否存在任何问题,只需将Git存储库拉到与没有git-svn的SVN工作副本相同的目录中?

2 个答案:

答案 0 :(得分:2)

没有真正的问题"因为两个系统都可以相互忽视 (除非git需要忽略任何.svn/目录,或者如果您使用的是最新的SVN 1.8,则需要忽略唯一的.svn/文件夹。

但是你的git repo必须在克隆到该repo之前获得http://remote.svn.repository/some_project 的所有最新更改(以便由gerrit使用)。
而你can't retain author and dates with git-svn,我也不认为手动同步,这意味着你的代码审查系统(gerrit)可能在这些条件下效率不高(即在不知道作者的情况下审查更改)。

答案 1 :(得分:1)

这种方法很快就会变得很麻烦,因为Subversion版本与它们的Git对应物之间的映射是隐含的;在Subversion和Git存储库中也很难保持忽略模式的正确对应。

替代解决方案是使用SubGit,它是服务器端的双向Git-SVN镜像。以下是使用SubGit 2.0(目前处于EAP阶段)的示例:

$ subgit configure --svn-url http://host.com/svn/repo GIT_REPO
# Adjust GIT_REPO/subgit/authors.txt to add author names and emails
# Specify at least one username/password at GIT_REPO/subgit/passwd
$ subgit install GIT_REPO

之后,GIT_REPO与您的Subversion存储库同步。您可以使用任何Git客户端来使用此Git存储库:所有推送的提交都会立即发送到SVN。

此外,您可以按如下方式设置Gerrit服务器并使用它:

$ git init .
$ git remote add subgit SUBGIT_URL
$ git fetch subgit
$ git remote add gerrit GERRIT_URL
$ git fetch gerrit
$ git commit -m 'Work in progress'
$ git push gerrit
$ git push subgit

一旦发出最后一个命令,SubGit就会将相应的Git提交转换为SVN修订版。

SubGit是一种商业产品,但只要处于EAP阶段,它就是免费的。我是SubGit开发人员之一。