将svn转换为git,如何使分支不仅仅是svn存储库中的远程分支?

17
我对 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-checkin 在其中一个分支中,但是当我执行 "git svn clone" 后,我的那个分支中的提交(它们还没有合并到主干中)在我的(git)主支中可见。我错过了什么吗?
此外,如果我在我的开发机上执行 "git clone ",我可以正确获取文件。但是,如果我执行 "git branch -r",我只能看到主分支而不是远程分支。
由于我们要完全摆脱 svn-repo,因此我希望在 git-repo 中拥有所有 svn 分支,以便可以从开发人员客户端访问它们。
再次说明,我不是完全的 git 新手,但离这很远。因此,如果我漏掉了某些基本内容,请告诉我。
更新 在阅读了一些 RTFM(man git-svn)之后,我通过以下命令解决了存在于主分支中的分支问题 reset --hard remotes/trunk
现在主干和master分支是相同的。下一步是弄清楚如何获取来自开发客户端的分支。
更新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服务器上,“分支”目录被称为“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的帖子,有更简单的方法...

4个回答

18

1
我在一个Git镜像的SVN服务器上使用了这种方法,我不断地从中获取数据,但这会破坏历史记录。这是预期的行为还是我做错了什么? - Doppelganger
你是救星!非常感谢! :) - chintan thakar

8

提供另一种实现方式,仅供参考,可以使用svn2git - 我正在将几个相当大的代码库转换为Git,它非常好用。它自动化了处理分支和将svn标签转换为真正的Git标签所需的所有步骤。


啊,那会省下我很多工作。但是嘿,至少现在我比以前更了解git了... :) - Jörgen Lundberg

5

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”的命令,以自动化这个过程,并且具有未来性,那就太好了。


1

我已经将两个svn仓库迁移到git(git版本1.7.0.4),按照Scott的方法,一个较小的和一个较大的。较小的一个表现如书中所述,而较大的一个需要使用David的解决方案。 另外一件事是

$ git push origin --all

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

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

这可能不明显,因为标志--all和书籍章节,并且我在删除本地git svn存储库之后才意识到这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接