将svn转换为git,如何让svn repo中的分支不仅仅是远程的?

时间:2009-10-18 11:43:11

标签: svn git git-svn

我对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-checkins已经在其中一个分支中,但当我执行“git svn clone”-stuff我在该分支中的提交(它们尚未合并到主干中)在我的(git)中可见)主分支。我在这里缺少什么?

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

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

同样,我不是一个完全的新手,但距离它不远。所以,如果有一些基本的东西我在这里失踪请告诉我。

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

  

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-repository克隆到我的dev-machine(注意,在我们的svn服务器上,“branches”dir被称为“branch” 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
Phew,现在你有了它,现在我可以摆脱那个svn-repo。

更新3
在下方结帐ebneters post可以更轻松地完成此操作...

4 个答案:

答案 0 :(得分:15)

有关如何进行相当好的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

希望这有帮助。

答案 1 :(得分:8)

另一个好方法,只是为了记录,是使用svn2git - 我正在转换几个相当大的存储库,它一直是天赐之物。它可以自动执行处理分支和将svn标记转换为真正的git标记所需的所有步骤。

答案 2 :(得分:5)

斯科特的解决方案对我不起作用。我怀疑最近版本的git-svn中有些内容可能已经发生了变化,因为他发布了(并且自编写链接的书籍以来),因为它似乎在克隆完成后立即进行垃圾收集。但这只是猜测为什么它不起作用。我正在使用git 1.6.5.6。

具体来说,我的.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和上面的结果取得了最大的成功。

一厢情愿:如果git-svn只是添加了一个像'放弃'或'迁移'这样的命令,那将会很好,这将会以一种面向未来的方式自动化这个过程。

答案 3 :(得分:1)

我已经按照Scott的配方将一个2 svn repos迁移到git(git版本1.7.0.4),一个较小的和一个较大的配方。较小的一个表现如斯科特在书中所描述的那样。较大的一个需要David的解决方案。 另一件事是

$ git push origin --all

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

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

这可能不是从旗帜中显而易见的 - 所有和书籍章节我都意识到了 这是在我删除了本地git svn repo。

之后