我正在尝试从一个结构如下的旧SVN存储库创建一个新的git存储库:
/root
trunk
build_scripts
packager
0.1.0
0.1.1
0.1.2
...etc...
0.x显然传统上位于tags
目录中,并且是trunk
中软件的版本,代表了需要保留的软件的打包版本。另外两个是用于打包和测试的支持脚本。
主要是我提交存储库 - 每个版本都是使用svn copy
命令创建的。
这可能不是最好的做法,但它很容易开发 - 我检查了构建环境,随后检查了trunk以供我使用。打包脚本会复制出新标签,并在我准备好时为我创建一个可下载的包。
如何清理它并将其带入git存储库?理想情况下,我想使用最佳实践,并希望保留所有历史记录。
我尝试过使用svn2git
:
svn2git path-to-repo --trunk trunk --nobranches --authors=/path/to/authors.txt
为我填充了一个带有主干的仓库,但是我没有看到任何标签(git tag
没有显示任何内容)。理想情况下,我也希望将其他脚本带回来。
我使用GIT的主要目的是我的开发方法 - 有时候我会坚持从测试机器开发,并且想要提交一个测试存储库,我可以在将其推向上游之前修复错误。现在我只是将破碎的东西提交到中央SVN存储库并检查测试机器。这显然很糟糕。
如果有必要,我很乐意花一些时间清理SVN回购 - 我还没准备好抛弃它。
答案 0 :(得分:2)
清理SVN仓库对您没有帮助,因为您无法移动现有修订中的目录,而这将是您要导入的目录。
我没有使用svn2git
的经验,但只有git svn
我只是:
仅初始化中继线:
git svn init -A /path/to/authors.txt --prefix=svn/ -t trunk url://to/svn/root
手动编辑svn部分,手动列出我要导入的标签和分支,如下所示:
[svn-remote "svn"]
url = url://to/svn/root
fetch = trunk:refs/remotes/svn/trunk
fetch = build_scripts:refs/remotes/svn/build_scripts
fetch = packager:refs/remotes/svn/packager
tags = 0.*:refs/remotes/svn/tags/0.*
我不完全确定标签线是否有效;如果没有,您可以始终明确列出所有现有标签。
设置完所有内容后运行git svn fetch
不幸的是,当在svn repo中创建一个新分支时,你必须在获取git之前添加匹配模式;如果git-svn已经获取了一个修订版而没有创建一个分支,因为它没有它的模式,它将无法返回到它并且只会导入它的任何新修订版。而且我没有找到任何方法告诉它重新删除那些分支。