使用subgit镜像进行单向同步

时间:2015-04-02 05:22:14

标签: git svn subgit

我已经设置了subgit来将一个assembla svn存储库镜像到git。我只想使用svn-> git方式。无论如何,我没有权利提交svn repo,因此当尝试同步回svn(git-> svn)时,subgit会出现错误消息。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

不支持推送一些Git分支而不将它们转换为SVN同时保持与SVN分支同步是不可能的。所以解决方案是使用一组Git分支,同时保持另一组分支与SVN同步。那些同步分支应该手动定期合并到第一组的分支。使用SubGit有几种方法可以做到这一点。

方法1。使用单独的命名空间。例如,您可以在使用refs/heads/svn/*时将refs/tags/svn/*refs/heads/*同步到SVN。为此,请使用SubGit配置文件中的以下选项:

trunk = trunk:refs/heads/svn/master
branches = branches/*:refs/heads/svn/*
tags = tags/*:refs/tags/svn/*
shelves = shelves/*:refs/shelves/svn/*

因此,当您克隆此类存储库时,SVN trunk已转换为refs/remotes/origin/svn/master,您应定期使用git merge手动合并该分支,以使您的本地refs/heads/master成为或多或少与SVN保持同步。

方法2. 自从SubGit 3.0(或3.0.0-EAP版本发布之后),您可以将与SVN同步的所有分支限制为一个或多个分支(其他分支/标签/货架)选项被删除):

trunk = trunk:refs/heads/master
branches = branches/branch1:refs/heads/branch1
branches = branches/branch2:refs/heads/branch2

之后refs/heads/branch1refs/heads/branch2refs/heads/master将与SVN同步,而refs/heads/branch3将不会。

方法3。自SubGit 3.0(或3.0.0-EAP版本发布之前),您可以从同步中排除一个或多个分支:

trunk = trunk:refs/heads/master
branches = branches/*:refs/heads/*
tags = tags/*:refs/tags/*
shelves = shelves/*:refs/shelves/*
excludeBranches = branches/nosync1
excludeBranches = branches/nosync2

此配置同步除refs/heads/*refs/heads/nosync1以外的所有refs/heads/nosync2,因为如果它们已同步,则会将其转换为branches/nosync1branches/nosync2,但会被忽略

实际上,您并不局限于这些,但您可以根据自己的需要将它们混合使用。