在我们的分布式开发团队中,我们有一个远程放置的集中式SVN存储库,用于提交源代码的多个团队。为了提高本地性能,我们决定使用 Gerrit (当然是Git而不是SVN)进行代码审查,因此我们将Git的主设备设置为与远程SVN互操作的“HUB”库中。
通常,此问题的解决方法是git-svn。但是,通过git-svn克隆的分支具有不同的文件夹结构,而不是传统的“.git”,Gerrit无法识别。
所以我们采用一种看起来有点幼稚的手段..
在与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存储库拉到与没有git-svn的SVN工作副本相同的目录中?
答案 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开发人员之一。