将 SVN 子目录转换为 Git
Posted
技术标签:
【中文标题】将 SVN 子目录转换为 Git【英文标题】:Convert SVN Subdirectory to Git 【发布时间】:2010-05-02 01:32:25 【问题描述】:我想为 Git 放弃 SVN。我当前的 SVN 存储库设置在主干下有项目(/trunk/projecta
、/trunk/projectb
等,标签和分支在/tags/projecta-1.0
等)。我想通过使用 git-svn 将它们从 SVN 中拉出,为每个项目创建不同的 Git 存储库。
我已成功将整个 SVN 存储库提取到本地 Git 存储库,但所有项目现在都存在于同一个 Git 存储库中。此时是否可以将它们分开?
【问题讨论】:
我听说有比 git-svn 更好的将 Subversion 转换为 Git 的长期选项(因为 git-svn 专门用于能够提交),但是我没有任何关于手的参考资料。 【参考方案1】:这很棘手。例如,要获取一个项目的标签,它的所有标签都必须位于一个公共目录下,但您的结构中的所有项目都共享一个标签目录。
也许您可以将 /tags/projecta-1.0 移动到 /tags/projecta/1.0 等等,然后一次将项目导入 git:
git-svn init --trunk=trunk/projecta --tags=tags/projecta ...
我不知道这是否会按预期工作,所以请在您的存储库的副本上执行此操作,而不是原始版本!
【讨论】:
我不太关心标签/分支,所以这很有效。我在我的 Ubuntu Lynx 机器上执行了这个:"""git svn clone --no-metadata --trunk=trunk/projecta svn/repoprojecta""" 挺诡计的,最简单的方法是新建两个git项目,将ProjectA和ProjectB对应复制到git repo,但是这样会丢失所有历史:(【参考方案2】:我最近不得不用一个相当复杂的案例来解决这个问题(从 BRL-CAD 的整体历史中提取 utahrle 文件以创建一个单独的 GIT 项目)并最终使用带有规则文件的 svn2git。这些是我的步骤 - 不确定这是否是“正确”的方式,但在我的情况下似乎已经成功:
确保已安装 svn2git,以及 subversion 和 git (启用 git subversion 支持,如果不存在的话。)注意 似乎有多个程序使用项目名称 svn2git - 我用的是这个:
http://www.gitorious.org/svn2git
这篇来自 KDE 的文章让我开始了:
http://techbase.kde.org/Projects/MoveToGit/UsingSvn2Git
获取 svn 存储库的本地副本。请注意,这 不是存储库的 checkout,而是 整个 SVN repo 数据集。 Sourceforge 使这成为可能 带有 rsync 选项 - 有关详细信息,请参阅他们的文档:http://sourceforge.net/p/forge/documentation/rsync%20Backups/。我不是 确定其他网站。
mkdir svn_repo
cd svn_repo
rsync -av svn.code.sf.net::p/PROJECTNAME/MOUNTPOINT .
cd ..
在 svn 提交者和 git 提交者之间创建身份映射
文件:账户地图
svnname1 Jane Coder <coder@foo.org>
svnname2 Joe Techwriter <writer@foo.org>
创建 svn2git 过滤规则以捕获 utahrle 历史记录。 我将在此处发布完整的 utahrle 示例,展示如何 遵循不同目录之间的历史,但是 我希望大多数情况不会那么糟糕:
文件:规则
create repository utahrle
end repository
match /brlcad/trunk/libutahrle/
min revision 1
max revision 22796
repository utahrle
branch master
end match
match /brlcad/trunk/tools/
min revision 1
max revision 22814
repository utahrle
branch master
end match
match /brlcad/trunk/src/other/libutahrle/
min revision 22797
repository utahrle
branch master
end match
match /brlcad/trunk/src/other/URToolkit/
min revision 22815
repository utahrle
branch master
end match
match /
end match
运行 svn-all-fast-export 生成存档(svn_repo 是存放目录 您的颠覆文件的完整副本):
svn-all-fast-export --identity-map account-map --rules rules svn_repo
使用上述规则文件,utahrle 保存生成的 git 存储库。使用 gitk 检查我们期望看到的历史 实际存在,然后(如果您将此存储库用作在线 源存档)使用标准的 sourceforge 程序 用于上传现有的 git 存储库。
【讨论】:
【参考方案3】:另一个用于一次性转换 Subversion 存储库的程序是 Svn2Git(与 vdboor 的答案不同),它的依赖项更少,并且对我的存储库做得很好。
【讨论】:
【参考方案4】:当存储库布局相当复杂时,有一个名为svn2git
的工具可以使用规则集转换复杂的存储库。
你可以在这里下载:http://gitorious.org/svn2git/ 程序需要编译,需要Qt、Apache和SVN头文件。
【讨论】:
以上是关于将 SVN 子目录转换为 Git的主要内容,如果未能解决你的问题,请参考以下文章
如何在将一个巨大的存储库拆分为单独的存储库时将 SVN 转换为 GIT?
为啥 `git svn clone` 不能转换所有的 SVN 分支?