【问题标题】:Converting svn to git, how to get the branches not to be just remote in the svn repo?将 svn 转换为 git,如何让分支在 svn 存储库中不只是远程?
【发布时间】:2009-10-18 11:43:10
【问题描述】:

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

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

我最后一次 svn-checkins 已经在其中一个分支中,但是当我执行“git svn clone”时,我在该分支中的提交(它们尚未合并到主干中)在我的(git ) 主分支。我在这里错过了什么?

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

由于我们要一起摆脱 svn-repo,我希望将所有 svn 分支放在 git-repo 中,以便开发人员客户端可以访问它们。

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

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

reset --hard remotes/trunk

现在主干和主分支是一样的。现在,接下来是弄清楚如何从开发客户端获取分支。

更新 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 存储库克隆到我的开发机器(注意,在我们的 svn 服务器上,“分支”目录被称为“分支”witout '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-repo。

更新 3
在下面结帐ebneters post 以获得更简单的方法...

【问题讨论】:

    标签: svn git git-svn


    【解决方案1】:

    这里有一个相当详细的关于如何进行非常好的 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
    

    希望对您有所帮助。

    【讨论】:

    • 我在一个 svn 服务器的 git 镜像上使用了这个方法,我一直从中获取,这不知何故打破了历史。这是预期的还是我做错了什么。
    • 你是救星!非常感谢 ! :)
    【解决方案2】:

    另一个好方法是使用svn2git,作为记录,我正在转换几个相当大的存储库,这真是天赐之物。它自动化处理分支所需的所有步骤并将 svn 标签转换为真正的 git 标签。

    【讨论】:

    • 啊,那会为我节省很多工作。但是,嘿,至少我现在比以前更了解 git... :)
    【解决方案3】:

    Scott 的解决方案对我不起作用。我怀疑在最近版本的 git-svn 中可能发生了一些变化,因为他发布了该内容(并且自从编写了链接的书以来),因为一旦克隆完成,它似乎会积极地进行垃圾收集。但这只是对它为什么不起作用的猜测。我正在使用 git 1.6.5.6。

    具体来说,我的 .git/refs/remotes 目录完全是空的,除了 tags 目录也是空的。因此,我无法复制任何内容来使其正确。

    经过一番摸索,我能够通过检查文件 .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 结合上述取得了最大的成功。

    一厢情愿:如果 git-svn 简单地添加一个像“abandon”或“migrate”这样的命令,以一种面向未来的方式自动化这个过程,那肯定会很好。

    【讨论】:

      【解决方案4】:

      按照 Scott 的食谱,我已经将 2 个 svn 存储库迁移到 git(git 版本 1.7.0.4),一个较小的一个,一个较大的一个。较小的行为与斯科特在本书章节中描述的一样。较大的一个需要大卫的解决方案。 还有一点就是

      $ git push origin --all
      

      没有推送任何标签,而是我不得不这样做:

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

      这可能从标志 --all 和书籍章节中并不明显,我意识到 这是在我删除了本地 git svn repo 之后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多