我在windows服务器2012 r2上安装了scm manager 1.45作为一项服务。
我有一个subversion存储库转储文件。我设法将其导入scm管理器中的subversion repo。但我真的很想把它迁移到git存储库中,但我似乎不知道如何迁移。我希望所有的承诺历史都能遵循。
除了你用来保存共享存储库的工具之外,svn-git和一点命令行魔法将解决你的问题
我假设迁移是从类Unix系统中完成的,例如Linux、mac,甚至是在windows机器中运行的cygwin;如果您没有合适的cygwin安装,您可以尝试在windows平台中使用与msysgit一起安装的"Git-Bash">
1#获取SVN存储库的贡献者列表
将提交者列表提取到SVN存储库,为此,运行(从SVN存储库根目录):
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
它应该创建一个具有如下作者列表的文件:
jsmith = jsmith <jsmith>
您需要将其修改为以下内容:
jsmith = John Smith <john.smith@evil_corporation.com>
这一步很重要,因为git将在下一步中使用它来将SVN提交程序ID转换为git提交程序ID(注意,如果您愿意,您可以手动创建此文件)
2#将SVN存储库克隆为Git存储库
为此,执行:
git svn clone <SVN_repo_URL> -A authors-transform.txt --stdlayout ~/svn-git-migration
其中:
<SVN_repo_URL>
是您的SVN存储库,authors-transform.txt
是您刚刚创建的文件
注意,如果您在SVN存储库布局中使用了"标准"SVN分支命名法,它会很好地工作,如果不是这样,您需要通过将--stdlayout
参数替换为来向git-SVN指示创建分支的"文件夹"的名称
-T
(用于中继路径)-b
(用于分支路径)-t
(用于标签路径)参数
(您可以在此处找到有关git-svn-clone命令的详细解释)
这个步骤可能需要一段时间(它从SVN增量中逐一详细说明git历史),但当它完成时,SVN repo的git版本将在您的主目录svn-git-migration
文件夹中(如果您愿意,请在命令中指定任何其他路径)
3#将存储库(标签和主分支)结构转换为git
注意:这些命令需要在新的git存储库中执行,因此您需要移动到上一步中克隆repo的文件夹
Subversion不像git那样处理标记;Git-ths被重新标记为一个提交(Git标记只包含一个提交ID),但SVN标记是一个特殊的分支之王,因此在这里,我们需要定位存储库标记分支(查看refs/heads/tags),并在所有分支的顶端应用一个标记:
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
git tag "$ref" "refs/heads/tags/$ref";
git branch -D "tags/$ref";
done
此外,我们需要将主分支(SVN中的主干)重命名为git主分支"master">
git branch -m trunk master
现在,只需将新的/迁移的git存储库推送到git服务器(scmmanager?),就完成了:-)。请记住,您需要将git服务器存储库添加为远程存储库,在这里您可以找到一些帮助。
请确保您在SCM管理器存储库所在的位置具有读/写权限。
- 创建SCM管理器存储库所在的新目录MyProject
- 进入MyProject
- 执行命令git-svn从SCMmanagerSvnRepo克隆URL
- 通过SCM管理器"导入存储库"-->在"存储库导入向导"-->"从目录导入"中选择Git来添加新存储库
- 它现在应该检测到您的新存储库