我阅读了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

我不希望它这么简单,也不希望它是一个命令。但我确实希望它不要试图解释任何事情——只是说在这个例子中应该采取什么步骤。


当前回答

GitHub有一个导入程序。创建存储库后,可以通过其URL从现有存储库导入。如果适用,它将要求您提供证书,然后从那里开始。

当它运行时,它会找到作者,您可以简单地将他们映射到GitHub上的用户。

我已经在一些存储库中使用了它,而且它非常准确,速度也快得多!一个大约4000次提交的存储库花了10分钟,之后我的朋友花了4天!

其他回答

请参阅git-svn官方手册页。特别是,请查看“基本示例”:

跟踪和贡献整个Subversion管理的项目(完成具有主干、标签和分支):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

我使用了svn2git脚本,工作起来很有魅力。

收回,收回

对于复杂的案件,埃里克·S·雷蒙德(Eric S.Raymond)的收回是首选工具。除了SVN,它还通过快速导出格式和CVS支持许多其他版本控制系统。作者报告了Emacs和FreeBSD等古代存储库的成功转换。

该工具显然旨在实现近乎完美的转换(例如将SVN的SVN:ignore财产转换为.gitignore文件),即使是对于历史悠久的复杂存储库布局也是如此。在许多情况下,其他工具可能更容易使用。

在深入研究repourgeon命令行的文档之前,请务必阅读出色的DVCS迁移指南,该指南将逐步介绍转换过程。

SubGit(vs死亡蓝屏)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

这就是全部。

+要从SVN更新,通过第一个命令创建Git存储库。

subgit import  directory/path/Local.git.Repo

我使用了一种方法来立即迁移到Git,以创建一个巨大的存储库。当然,你需要一些准备。但你可能根本不会停止开发过程。

这是我的路。

我的解决方案如下:

将SVN迁移到Git存储库在团队切换到之前更新Git存储库。

对于大型SVN存储库,迁移需要大量时间。但完成迁移的更新仅需几秒钟。

当然,我在使用SubGit,妈妈。gitsvn让我成为蓝屏死亡。只是不断。git-svn让我厌烦git的“文件名太长”致命错误。

步骤

1.下载SubGit

2.准备迁移和更新命令。

假设我们是为Windows做的(移植到Linux很简单)。在SubGit的安装bin目录(subbit-2.X.X\bin)中,创建两个.bat文件。

用于迁移的文件/命令的内容:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

“start”命令在这里是可选的(Windows)。它将允许在启动时看到错误,并在SubGit完成后打开一个shell。

您可以在这里添加类似于git-svn的其他参数。我只使用默认域myCompanyDomain.com来修复SVN作者电子邮件地址的域。我有标准的SVN存储库结构(主干/分支/标签),我们在“作者映射”方面没有问题。所以我什么都不做了。

(如果你想迁移像分支这样的标记,或者你的SVN有多个分支/标记文件夹,你可以考虑使用更详细的SubGit方法)

技巧1:使用--最小修订版YourSvnRevNumber快速查看事情的发展(某种调试)。特别有用的是查看已解析的作者姓名或电子邮件。或者限制迁移历史深度。

提示2:迁移可能会被中断(Ctrl+C),并通过运行下一个更新命令/文件来恢复。我不建议对大型存储库这样做。我收到了“内存不足Java+Windows异常”。

技巧3:最好创建结果裸存储库的副本。

用于更新的文件/命令的内容:

start    subgit import  directory/path/Local.git.Repo

当您想获得最后一个团队对Git存储库的提交时,可以随时运行它。

警告不要触摸您的裸存储库(例如创建分支)。您将出现下一个致命错误:

无法恢复的错误:不同步,无法同步。。。正在将Subversion修订转换为Git提交。。。

3.运行第一个命令/文件。对于一个大仓库来说,这需要很长时间。我简陋的仓库需要30小时。

这就是全部。通过运行第二个文件/命令,您可以随时从SVN更新Git存储库。在将开发团队切换到Git之前。只需要几秒钟。



还有一项更有用的任务。

将本地Git存储库推送到远程Git存储

这是你的情况吗?让我们继续。

配置遥控器

Run:

$ git remote add origin url://your/repo.git

准备将巨大的本地Git存储库首次发送到远程存储库

默认情况下,Git无法发送大块数据。致命:远端意外挂断

让我们跑吧:

git config --global http.postBuffer 1073741824

524288000-500 MB1073741824-1 GB等。

修复本地证书问题。如果您的git服务器使用了损坏的证书。

我已禁用证书。

此外,您的Git服务器可能存在需要更正的请求量限制。

将所有迁移推送到团队的远程Git存储库。

使用本地Git运行:

git push origin --mirror

(git push origin“*:*”用于旧git版本)

如果出现以下错误:error:无法派生git:没有这样的文件或目录。。。对我来说,完全重新创建存储库解决了这个错误(30小时)。您可以尝试以下命令

git push origin --all
git push origin --tags

或者尝试重新安装Git(对我来说没用)。或者您可以从所有标签创建分支并推送它们。或者,或者,或者。。。

创建一个用户文件(即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