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

Jör*_*erg 17 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)后,我解决了主分支中存在分支内容的第一个问题

重置 - 硬件遥控器/主干

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

更新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
Run Code Online (Sandbox Code Playgroud)

然后我将svn-repository克隆到我的dev-machine(注意,在我们的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
Run Code Online (Sandbox Code Playgroud)

然后进行一些清理以按顺序获取标签和分支:

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
Run Code Online (Sandbox Code Playgroud)

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

dev> git remote add origin jorgen@<our_server>:/usr/local/git-repos/my_project.git
Run Code Online (Sandbox Code Playgroud)

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

dev> git push origin --all
Run Code Online (Sandbox Code Playgroud)

Phew,现在你有它,现在我可以摆脱那个svn-repo.

更新3
Checkout ebneters发布在下面,以便更轻松地进行...

小智 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
Run Code Online (Sandbox Code Playgroud)

希望这很有帮助.


ebn*_*ter 8

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


小智 5

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

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

经过一番探讨之后,我能够通过检查文件.git/packed-refs以及对以下内容执行搜索和替换来解决此问题(按此顺序):

refs/remotes/tags => refs/tags
refs/remotes => refs/heads
Run Code Online (Sandbox Code Playgroud)

如果您的编辑器是vim,则可以使用以下两个命令执行此操作:

:%s/refs\/remotes\/tags/refs\/tags/g
:%s/refs\/remotes/refs\/heads/g
Run Code Online (Sandbox Code Playgroud)

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

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