问题 如何使用git-svn将以不同目录为根的svn分支导入git?


我有一个SVN存储库结构,如下所示。我们在分支下使用多个级别用于各种发布维护分支,以及功能分支的目录。

git-svn init似乎使用单个 - 分支参数,即它似乎期望所有分支都在一个位置。

trunk
branches
  1.1
    1.2.1
    1.2.2
  1.2
    1.2.1
    1.2.2
    1.2.3
  features
    feature1
    feature2

关于如何处理这个问题的任何想法?

谢谢


6543
2017-11-03 13:13


起源

可能自2008年以来已发生变化,但现在“你可以指定不止一个 --tags 和/或 --branches 选项,以防你的Subversion存储库在多个路径下放置标签或分支。“(引自 man git svn branch) - steffen


答案:


在配置文件中,将svn-remotes部分设置为:

[svn-remote "svn"]
    url = svn://svnserver/repo
    fetch = trunk:refs/remotes/trunk
    branches = branches/*/*:refs/remotes/*
    tags = tags/*:refs/remotes/tags/*

这应该让你抓住嵌套的分支。


13
2018-03-10 15:04



这完全解决了我的问题。我已经使用了一段时间了。它确实需要更高版本的git和/或svn,抱歉我不知道细节,但我目前正在使用git 1.6.2.5和svn 1.5.1,它可以正常工作。 - CaptainPicard
我在哪里放这个配置? - Arthur Ulfeldt
〜/ myrepo / .git / config :) - Arthur Ulfeldt
你需要删除 .git/svn/.metadata 并且git a git svn fetch 刷新分支/标记列表 - rcoup
如果你有branch / a / thisname和branch / b / thisname怎么办?它不会爆炸吗? - android.weasel


按照惯例,Subversion将所有分支都存放在Subversion存储库中的单个“分支”路径中,所以我并不感到惊讶 git-svn 做出这个假设。

我建议如下(请注意,您可能会在此操作中丢失一些历史记录):

  1. 展平Subversion branches 路径,使用命名约定来保持唯一标识和当前结构的概念。
  2. 演出 git-svn
  3. 移动中的东西 git 存储库以符合您的做法。

的危险 losing history 取决于如何 git-svn 跟踪来自不同路径的复制操作。我最近遇到了迁移subversion存储库(1.4-ish)的问题。


1
2017-11-03 13:48



你的意思是在svn服务器上的计算机上展平svn分支(我不能这样做)? - Arthur Ulfeldt


是否可行创建一个 git 每个分支子目录的repo?


0
2017-11-03 13:20



然后,什么,将它们合并在一起并在事后创建适当的分支/标签?必须有一个更简单的解决方案 - Peter Burns
最简单的解决方案是将您的分支目录展平为一个目录,这不仅会产生 git 开心,也带你的回购符合 svn 约定。我不确定你的情况有多实用。 - Hank Gay


你可以添加多个 git svn 每个分支的遥控器,或者可能是分支的每个目录。最初的 git svn fetch 需要永远,但从我的理解它应该工作。


0
2017-11-06 00:00