5

背景

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

问题

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

目前的解决方法

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

  1. 查看远程 SVN 存储库。
  2. 在与 SVN 工作副本完全相同的目录中,git clone 对应的 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,是否有任何问题?

4

2 回答 2

2

没有真正的“问题”,因为这两个系统几乎可以互相忽略。(如果您使用的是最新的 SVN 1.8 ,
git 需要忽略任何.svn/目录或唯一文件夹除外).svn/

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

于 2013-04-26T11:38:52.983 回答
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 开发人员之一。

于 2013-05-06T15:42:40.417 回答