代码之家  ›  专栏  ›  技术社区  ›  Jörgen Lundberg

将SVN转换为Git,如何使分支不只是SVN报告中的远程分支?

  •  16
  • Jörgen Lundberg  · 技术社区  · 17 年前

    我对Git很陌生,我正在尝试将SVN存储库移动到Git。我遵循下面的指南,所以现在我的服务器上有一个git repo
    http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/

    所以,如果我执行“git branch”,git会回复“*master”,如果我执行“git branch-r”,我会得到SVN存储库中所有分支的列表。

    我上一次的SVN签入是在其中一个分支中进行的,但是当我执行“Git SVN克隆”时,我在该分支中的提交(尚未合并到主干中)在我的(Git)主分支中可见。我这里缺什么?

    另外,如果我在我的开发机器上执行“git克隆”,我就可以得到文件。但是如果我执行“git branch-r”,我只能看到主分支,而不能看到远程分支。

    既然我们一起摆脱了SVN回购,我希望在Git回购中拥有所有的SVN分支,以便可以从开发人员客户机访问它们。

    再说一次,我不是一个完全的Git新手,但离它不远。所以,如果我在这里遗漏了一些基本的东西,请告诉我。

    更新
    在做了一些RTFM(man git svn)之后,我解决了主分支中存在的分支内容的第一个问题。

    重置——硬遥控器/行李箱

    现在主干和主分支是一样的。现在,下一步是了解如何从开发客户机获取分支。

    更新2
    我把上面的URL和Scott指向的URL结合起来使用。所以,从一开始。

    我首先在服务器上创建了一个空的存储库,它们保存在服务器上的/usr/local/git repos中:

    server> cd /usr/local/git-repos
    server> mkdir my_project.git
    server> cd my_project.git
    server> git init
    

    然后我将SVN存储库克隆到我的dev机器上(注意,在我们的SVN服务器上,“branches”dir称为“branch” 威特 “s”):

    dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project
    

    然后进行一些清理,以使标签和分支按顺序排列:

    dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
    dev> rm -Rf .git/refs/remotes/tags
    dev> cp -Rf .git/refs/remotes/* .git/refs/heads/
    dev> rm -Rf .git/refs/remotes
    

    现在将我的服务器添加为远程存储库:

    dev> git remote add origin jorgen@<our_server>:/usr/local/git-repos/my_project.git
    

    最后,将所有分支和标记推送到服务器上:

    dev> git push origin --all
    

    啊,现在你有了,现在我可以摆脱SVN回购了。

    更新3
    结帐 ebneters post 下面是一个更简单的方法…

    4 回复  |  直到 17 年前
        1
  •  15
  •   Paul DelRe    9 年前

    有一个非常详细的关于如何进行非常好的SVN导入的解释,解释了如何在这里正确地转换分支:

    https://git-scm.com/book/en/v1/Git-and-Other-Systems-Migrating-to-Git

    简单的答案是运行:

    $ cp -Rf .git/refs/remotes/* .git/refs/heads/
    $ rm -Rf .git/refs/remotes
    

    希望有帮助。

        2
  •  8
  •   ebneter    17 年前

    另一个很好的方法就是使用 svn2git “我正在转换几个相当大的存储库,这是天赐良机。”它自动化了处理分支和将SVN标记转换为真正的Git标记所需的所有步骤。

        3
  •  5
  •   David    16 年前

    斯科特的解决方案对我不起作用。我怀疑在GitSvn的最新版本中,自他发布后(以及自编写了链接书以来),可能发生了一些变化,因为克隆完成后,它似乎会迅速地进行垃圾收集。但这只是对它为什么不起作用的猜测。我用的是Git 1.6.5.6。

    具体来说,my.git/refs/remotes目录是完全空的,除了一个标签目录,它也是空的。所以我无法复制任何东西来纠正它。

    在浏览了一些之后,我可以通过检查文件.git/packed-refs并对以下内容进行搜索和替换(按此顺序)来解决这个问题:

    refs/remotes/tags => refs/tags
    refs/remotes => refs/heads
    

    如果您的编辑器是vim,那么您可以使用以下两个命令进行操作:

    :%s/refs\/remotes\/tags/refs\/tags/g
    :%s/refs\/remotes/refs\/heads/g
    

    svn2git 1.3.1也没有为我生成一个可用的结果(几个月前在某个点之后没有导入任何提交,分支都显示了相同的提交)。目前,我已经放弃了svn2git,并且在使用git-svn的同时也取得了最大的成功。

    一厢情愿的想法:如果Gitsvn简单地添加了一个类似“放弃”或“迁移”的命令,以一种未来验证的方式使这个过程自动化,那当然是件好事。

        4
  •  1
  •   radovan    15 年前

    我已经按照Scott的配方将2个SVN Repo迁移到了Git(Git版本1.7.0.4),一个较小的版本和一个较大的版本。较小的一个行为就像斯科特在书中所描述的那样。较大的一个需要大卫的解决方案。 另一件事是

    $ git push origin --all
    

    没有推任何标签,而是我必须这样做:

    $ git push origin --all
    $ git push origin --tags
    

    从国旗上看,这可能并不明显——从书的章节来看,我意识到 这是在我删除了本地git svn repo之后。