如果在SVN和Git之间使用共享存储库,而不使用Git-SVN,会有什么问题吗



背景

在我们的分布式开发团队中,我们有一个远程放置的集中式SVN存储库,用于多个团队提交源代码。为了提高本地性能,我们决定在代码审查过程中使用Gerrit(当然是Git而不是SVN(,因此我们将Git的master设置为与远程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.

问题

如果在SVN和Git之间使用共享存储库,只将Git存储库拉到与SVN工作副本相同的目录中,而不使用Git-SVN,会有什么问题吗?

没有真正的"问题",因为两个系统几乎可以忽略彼此
(除了git需要忽略任何.svn/目录,或者唯一的.svn/文件夹,如果您使用的是最新的SVN1.8(

但是,在被克隆到git-reo中之前,您的git-reo必须已经获得http://remote.svn.repository/some_project的所有最新更改(以便被gerrit使用(
而且你不能用git-svn保留作者和日期,我认为手动同步也不能,这意味着你的代码审查系统(gerrit(在这种情况下可能没有那么有效(即在不知道作者的情况下审查更改(。

由于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

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

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

最新更新