我如何将带有历史记录的SVN存储库迁移到新的Git存储库?

我阅读了Git手册,常见问题解答,Git - SVN速成教程等,他们都解释了这个和那个,但是你没有找到一个简单的指令,例如:

SVN仓库: svn://myserver/path/to/svn/repos

Git仓库: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history 
svn://myserver/path/to/svn/repos 
git://myserver/path/to/git/repos

我不指望它那么简单,我也不指望它是一个单一的命令。 但我希望它不要试图解释任何事情 - 只是说明在这个例子中要采取的步骤。


魔法:

$ git svn clone http://svn/repo/here/trunk

Git和SVN的运行方式非常不同。 你需要学习Git,如果你想跟踪SVN上游的变化,你需要学习git-svngit-svn手册页有一个很好的示例部分:

$ git svn --help

创建用于将SVN用户映射到Git的用户文件(即users.txt ):

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

您可以使用这一行代码从现有的SVN存储库构建模板:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

如果SVN发现缺少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 help )。

所有常见的协议都是允许的: svn://http://https:// 。 该URL应定位到基本存储库,如http://svn.mycompany.com/myrepo/repository。 那一定不能包含/trunk/tag/branches

请注意,在执行此命令后,它经常看起来像是“挂起/冻结”操作,并且在初始化新存储库后很长时间卡住它是很正常的。 最终,您将看到指示它正在迁移的日志消息。

还要注意,如果你省略了--no-metadata标志,Git会在提交消息中附加关于相应SVN修订版的信息(例如git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>

如果找不到用户名,请更新您的users.txt文件,然后:

cd dest_dir-tmp
git svn fetch

如果你有一个大的项目,你可能必须多次重复上一个命令,直到所有的Subversion提交都被提取出来为止:

git svn fetch

完成后,Git会将SVN trunk检入到一个新的分支中。 任何其他分支都设置为遥控器。 您可以查看其他SVN分支:

git branch -r

如果你想在你的仓库中保存其他远程分支,你想为每个分支手动创建一个本地分支。 (跳过主干/主)。如果你不这样做,分支将不会在最后一步克隆。

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

标签作为分支导入。 您必须创建一个本地分支,制作一个标签并删除分支,将它们作为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

干净地将Subversion版本库迁移到Git版本库。 首先你必须创建一个将你的Subversion提交作者名称映射到Git commiters的文件,比如~/authors.txt

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

然后,您可以将Subversion数据下载到Git存储库中:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

如果你在Mac上,你可以通过安装git-core +svn从MacPorts获得git-svn git-core +svn

如果你的Subversion版本库与你想要的git版本库在同一台机器上,那么你可以在init步骤中使用这个语法,否则所有的都是一样的:

git svn init file:///home/user/repoName --no-metadata
链接地址: http://www.djcxy.com/p/7179.html

上一篇: How do I migrate an SVN repository with history to a new Git repository?

下一篇: Definition of "downstream" and "upstream"