我对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可以更轻松地完成此操作...
答案 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 / 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。
之后