创建一个用户文件(即users.txt),用于将SVN用户映射到Git:
user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...
您可以使用这一行程序从现有SVN存储库构建模板:
svn log -q | awk -F '|' '/^r/ {gsub(/ /, "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt
如果SVN找到丢失的SVN用户(而不是在文件中),它将停止。但在那之后,您可以更新文件并从您停止的地方恢复。
现在从存储库中提取SVN数据:
git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp
该命令将在dest_dir-tmp中创建一个新的Git存储库,并开始拉动SVN存储库。请注意,“--stdlayout”标志表示您具有通用的“trunk/,branches/,tags/”SVN布局。如果您的布局不同,请熟悉--tags、--branches和--trunk选项(在一般的git-svn帮助中)。
允许使用所有通用协议:svn://、http://、https://。URL应该以基本存储库为目标,例如http://svn.mycompany.com/myrepo/repository.URL字符串不能包含/trank、/tag或/branches。
请注意,在执行此命令后,操作通常看起来像是“挂起/冻结”,并且在初始化新存储库后,它可能会被卡住很长一段时间,这很正常。最终,您将看到指示它正在迁移的日志消息。
还要注意,如果省略--no元数据标志,Git将在提交消息中附加有关相应SVN修订的信息(即Git-SVN-id:svn://svn.mycompany.com/myrepo/<branchname/trank>@<RevisionNumber><RepositoryUUID>)
如果找不到用户名,请更新users.txt文件,然后:
cd dest_dir-tmp
git svn fetch
如果您有一个大型项目,则可能需要重复最后一个命令几次,直到获取所有Subversion提交:
git svn fetch
完成后,Git将把SVN主干签出到一个新的分支中。任何其他分支都设置为远程。您可以通过以下方式查看其他SVN分支:
git branch -r
如果要在存储库中保留其他远程分支,则需要手动为每个远程分支创建一个本地分支。(跳过trunk/master。)如果不这样做,分支将不会在最后一步中被克隆。
git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same names
标记作为分支导入。您必须创建一个本地分支,创建一个标记并删除该分支,以便在Git中将它们作为标记。要使用标记“v1”:
git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1
将GIT-SVN存储库克隆到干净的GIT存储库中:
git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir
以前从远程分支创建的本地分支将仅作为远程分支复制到新克隆的存储库中。(跳过主干/主干。)对于要保留的每个分支:
git checkout -b local_branch origin/remote_branch
最后,从干净的Git存储库中删除指向现已删除的临时存储库的远程:
git remote rm origin