我想出了一种从任意 svn 存储库结构中提取多个分支的方法。
仅当所有分支都在存储库的子目录中组合在一起时,该-b
选项git svn init
才有效,例如在标准布局中。如果包括树干在内的所有分支并排在同一个文件夹中,这将无法正常工作。您可以通过在您的 git 存储库中创建多个“主干”来从 svn 存储库中提取选定的分支。
假设问题的平面结构具有三个分支树干、featureX 和 featureY。
实例化您的 git 存储库。
mkdir myproject
cd myproject
git svn init url:to/svn/repo -T trunk
这将在文件中创建一个带有 svn 元数据的 git 存储库.git/config
。
打开配置文件并检查 svn 元数据
vim .git/config
你的配置文件看起来像这样。
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
autocrlf = false
[svn-remote "svn"]
url = url:to/svn/repo
fetch = trunk:refs/remotes/trunk
标svn-remote
头定义了一个名为“svn”的引用,指向您的 svn 存储库。该fetch
参数告诉 git-svn 从 svn 存储库中提取新修订的位置。现在我们需要告诉 git-svn 我们感兴趣的另一个分支。
复制svn-remote
部分
复制配置文件的整个svn-remote
部分并将其粘贴到现有配置文本下方。
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
autocrlf = false
[svn-remote "svn"]
url = url:to/svn/repo
fetch = trunk:refs/remotes/trunk
[svn-remote "svn"]
url = url:to/svn/repo
fetch = trunk:refs/remotes/trunk
修改新svn-remote
部分
更改svn-remote
节标题的名称和它指向的分支的名称。
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
autocrlf = false
[svn-remote "svn"]
url = url:to/svn/repo
fetch = trunk:refs/remotes/trunk
[svn-remote "svn-featureX"]
url = url:to/svn/repo
fetch = featureX:refs/remotes/featureX
现在 git-svn 将跟踪两个 svn 分支。您可以将名称“svn”和“svn-featureX”与任何带有[svn-remote]
参数的 git-svn 命令一起使用。您可以将名称“trunk”和“featureX”与任何将远程分支名称作为参数的 git 命令一起使用。
该解决方案无法很好地扩展,并且与格式错误的 svn 存储库一起使用有点麻烦。只要您只需要跟踪少数 svn 分支,就可以正常工作。如果您需要使用的 svn 分支数量太大,请认真考虑将您的 svn 存储库重组为标准布局。