我已经设置了subgit来将一个assembla svn存储库镜像到git。我只想使用svn-> git方式。无论如何,我没有权利提交svn repo,因此当尝试同步回svn(git-> svn)时,subgit会出现错误消息。有没有办法实现这个目标?
答案 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/branch1
,refs/heads/branch2
和refs/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/nosync1
和branches/nosync2
,但会被忽略
实际上,您并不局限于这些,但您可以根据自己的需要将它们混合使用。