如何将包含历史记录的SVN存储库迁移到新的Git存储库?

Mil*_*kov 1486 svn git version-control git-svn

我阅读了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
Run Code Online (Sandbox Code Playgroud)

我不希望它那么简单,我不指望它是一个单一的命令.但我确实希望它不要试图解释任何事情 - 只是说这个例子采取了哪些步骤.

cmc*_*nty 1533

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

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...
Run Code Online (Sandbox Code Playgroud)

您可以使用此单行程序从现有SVN存储库构建模板:

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

如果SVN发现缺少SVN用户,SVN将停止.但之后,您可以更新文件并从中断的地方继续.

现在从存储库中提取SVN数据:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp
Run Code Online (Sandbox Code Playgroud)

此命令将创建一个新的Git存储库dest_dir-tmp并开始拉动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
Run Code Online (Sandbox Code Playgroud)

如果你有一个大项目,你可能需要多次重复那个最后一个命令,直到所有的Subversion提交都被提取:

git svn fetch
Run Code Online (Sandbox Code Playgroud)

完成后,Git会将SVN签trunk入新分支.任何其他分支都设置为遥控器.您可以通过以下方式查看其他SVN分支:

git branch -r
Run Code Online (Sandbox Code Playgroud)

如果要在存储库中保留其他远程分支,则需要手动为每个分支创建本地分支.(跳过trunk/master.)如果你不这样做,分支将不会在最后一步克隆.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name
Run Code Online (Sandbox Code Playgroud)

标签作为分支导入.你必须创建一个本地分支,制作一个标签并删除分支,使它们在Git中作为标记.要使用标记"v1"执行此操作:

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1
Run Code Online (Sandbox Code Playgroud)

将您的GIT-SVN存储库克隆到干净的Git存储库:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir
Run Code Online (Sandbox Code Playgroud)

您之前从远程分支创建的本地分支将仅作为远程分支复制到新的克隆存储库中.(跳过trunk/master.)对于你想要保留的每个分支:

git checkout -b local_branch origin/remote_branch
Run Code Online (Sandbox Code Playgroud)

最后,从干净的Git存储库中删除指向现在已删除的临时存储库的远程数据库:

git remote rm origin
Run Code Online (Sandbox Code Playgroud)

  • Eelke的这篇博文是对上述答案的一个很好的交叉引用.http://blokspeed.net/blog/2010/09/converting-from-subversion-to-git/ (35认同)
  • 对于Windows下的用户,我基于这种方法创建了一个PowerShell脚本:https://gist.github.com/Gimly/90df046dc38181bb18de (7认同)
  • 这是99%真棒,按照这些步骤,除了分支之外我按顺序排序:在最后一步之后,它们只是远程的(当我执行命令时就消失了:git remote rm origin) (4认同)
  • GitHub有一个非常方便的步骤:https://github.com/nirvdrum/svn2git#readme (4认同)
  • **警告**对于具有悠久历史的大型仓库,这是**缓慢而令人讨厌的**。我放弃了尝试迁移所有旧分支而只是迁移主干的尝试。 (4认同)
  • 我只是使用了这个程序而且效果很好.我的观察结果是:1)将"标签分支"转换为标签的过程仍然离开了分支(虽然没有标记).如果您在SVN中创建了标记而未修改内容,那么您实际上可以标记前面的提交并删除"标记分支"以获得更清晰的历史记录.2)没有提到迁移svn:ignore属性.这在互联网的其他地方有所涉及.另见'git svn show-ignore'.3)最后的克隆对我没有好处.实际上,我最终得到了原始目录的遥控器,这很奇怪. (3认同)
  • 我必须在我的users.txt文件中添加一个'(无作者)'行,如下所述:http://blokspeed.net/blog/2010/09/converting-from-subversion-to-git/我也得到了`在替代中使用未初始化的值并且必须遵循以下条件:https://groups.google.com/forum/?fromgroups =#!topic/msysgit/7MQVwRO-2N4 (2认同)
  • 我不得不从 `users.txt` 中删除 `=` 字符附近的空格,因为 `somebody = Somebody &lt;mail@mail.com&gt;` 不起作用(在第一次提交后导入中止,留下一个空的存储库)但是 `somebody =Somebody &lt;mail@mail.com&gt;` 工作正常。 (2认同)
  • 应该更新这个:`git svn show-ignore> .gitignore` (2认同)

jfm*_*fm3 521

魔法:

$ git svn clone http://svn/repo/here/trunk
Run Code Online (Sandbox Code Playgroud)

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

$ git svn --help
Run Code Online (Sandbox Code Playgroud)

  • @Casey的答案更好地回答了原始问题. (137认同)
  • 对于其他任何想知道哪个是"凯西答案"的人,这里引用了很多评论,这是[这一个](http://stackoverflow.com/a/3972103/122687)(凯西将他的昵称改为cmcginty). (63认同)
  • @Eildosa:这只会克隆主干.看看凯西对另一种选择的回答. (7认同)
  • 这会保留分支机构和一切吗?或者只是克隆行李箱? (3认同)
  • @DougWilson但我在这里看不到凯西的任何答案.以下是13位作者以"创建用户文件"开头的答案吗? (2认同)

Eug*_*ota 188

将您的Subversion存储库干净地迁移到Git存储库.首先,您必须创建一个将Subversion提交作者姓名映射到Git commiters的文件,例如~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>
Run Code Online (Sandbox Code Playgroud)

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

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Mac,则可以git-svn通过安装从MacPorts 获取git-core +svn.

如果您的subversion存储库与所需的git存储库位于同一台机器上,那么您可以将此语法用于init步骤,否则完全相同:

git svn init file:///home/user/repoName --no-metadata
Run Code Online (Sandbox Code Playgroud)

  • 啊! 简单有效的解释.在我的情况下`file:///`拒绝工作,只是我使用`svnserve.exe --daemon`然后使用`svn:// localhost/home/user/repo`代替. (7认同)
  • 对于我的情况,我必须将文件`authors.txt`转换为`utf-8而不用BOM. (3认同)
  • 该链接似乎缺少一些信息 (2认同)

Thi*_*ira 70

我使用了svn2git脚本,就像一个魅力.

  • 问:这是否修复了标记和分支名称中的空格(在svn中允许并且在git中不允许)? (4认同)
  • 本指南使用它很有帮助:http://www.troyhunt.com/2014/08/migrating-from-subversion-to-git-with.html (2认同)

web*_*mat 58

我建议在尝试不断使用git-svn之前熟悉Git,即将SVN保持为集中式仓库并在本地使用Git.

但是,对于包含所有历史记录的简单迁移,以下是几个简单的步骤:

初始化本地仓库:

mkdir project
cd project
git svn init http://svn.url
Run Code Online (Sandbox Code Playgroud)

标记您想要开始导入修订的距离:

git svn fetch -r42
Run Code Online (Sandbox Code Playgroud)

(或者只是所有转速的"git svn fetch")

从那以后实际上取了所有东西:

git svn rebase
Run Code Online (Sandbox Code Playgroud)

您可以使用Gitk检查导入的结果.我不确定这是否适用于Windows,它适用于OSX和Linux:

gitk
Run Code Online (Sandbox Code Playgroud)

当您在本地克隆SVN repo时,您可能希望将其推送到集中的Git仓库以便于协作.

首先创建你的空远程仓库(也许在GitHub上?):

git remote add origin git@github.com:user/project-name.git
Run Code Online (Sandbox Code Playgroud)

然后,可选地同步您的主分支,以便当两个包含新内容时,pull操作将自动将远程主服务器与您的本地主服务器合并:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master
Run Code Online (Sandbox Code Playgroud)

在那之后,您可能有兴趣尝试我自己的git_remote_branch工具,这有助于处理远程分支:

第一个解释性帖子:" Git远程分支 "

最新版本的后续行动:" git与git_remote_branch合作的时间 "


Ale*_*aev 31

有一种新的解决方案可以顺利地从Subversion迁移到Git(或同时使用两者):SubGit.

我自己正在做这个项目.我们在我们的存储库中使用SubGit - 我的一些队友使用Git和一些Subversion,到目前为止它的效果非常好.

要使用SubGit从Subversion迁移到Git,您需要运行:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 
Run Code Online (Sandbox Code Playgroud)

之后你将获得svn_repos/.git中的Git存储库并可能克隆它,或者只是继续使用Subversion和这个新的Git存储库:SubGit将确保两者始终保持同步.

如果您的Subversion存储库包含多个项目,那么将在svn_repos/git目录中创建多个Git存储库.要在运行之前自定义翻译,请执行以下操作:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos
Run Code Online (Sandbox Code Playgroud)

使用SubGit,您可以迁移到纯Git(而不是git-svn)并开始使用它,同时在您需要时仍保留Subversion(例如,对于您已配置的构建工具).

希望这可以帮助!

  • 请注意,一次性导入(使用`subgit import`命令)似乎甚至不需要许可证.还包括将`svn:ignore`属性准确转换为`.gitignore`文件. (4认同)
  • SubGit 不会识别我的私钥,也不会识别我在命令行中设置的任何标志。文档很差。这不是`git svn`的可行替代方案。 (2认同)

EfF*_*ort 19

请参阅官方git-svn联机帮助页.特别是,请查看"基本示例":

跟踪并贡献整个Subversion管理的项目(包括主干,标签和分支):

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


it3*_*3xl 14

SubGit(vs蓝屏死机)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo
Run Code Online (Sandbox Code Playgroud)

这就是全部.

+从SVN更新,这是由第一个命令创建的Git存储库.

subgit import  directory/path/Local.git.Repo
Run Code Online (Sandbox Code Playgroud)

我使用一种方法立即迁移到Git以获得一个巨大的存储库.
当然你需要做一些准备.
但是你可能根本就没有停止开发过程.

这是我的方式.

我的解决方案如下:

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

迁移需要大量时间才能建立大型SVN存储库.
但只需几秒钟即可更新已完成的迁移.

当然我正在使用SubGit,妈妈.git-svn让我成为蓝屏死神.只是不断.git-svn让Git的" 文件名太长 "致命错误让我感到厌烦.

脚步

1. 下载SubGit

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

让我们说我们为Windows做这件事(移植到Linux是微不足道的).
在SubGit的安装bin目录(subgit-2.XX\bin)中,创建两个.bat文件.

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

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo
Run Code Online (Sandbox Code Playgroud)

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

您可以在此处添加类似于git-svn的其他参数.我只使用--default-domain myCompanyDomain.com来修复SVN作者的电子邮件地址域.
我有标准的SVN存储库的结构(主干/分支/标签),我们没有"作者映射"的麻烦.所以我什么都不做了.

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

提示1:使用--minimal-revision YourSvnRevNumber快速查看事情是如何发展的(某种调试).特别有用的是查看已解析的作者姓名或电子邮件.
或者限制迁移历史深度.

提示2:可以通过运行下一个更新命令/文件来中断(Ctrl+ C)迁移并恢复.
我不建议为大型存储库执行此操作.我收到了"Out of memory Java + Windows exception".

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

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

start    subgit import  directory/path/Local.git.Repo
Run Code Online (Sandbox Code Playgroud)

当您想获得最后一个团队对Git存储库的提交时,您可以运行任意次.

警告!不要触摸您的裸存储库(例如创建分支).
你将接下来的致命错误:

不可恢复的错误:不同步且无法同步...将Subversion修订版转换为Git提交...

3.运行第一个命令/文件.对于一个大型存储库来说,这需要花费很多时间.我不起眼的存储库需要30个小时.

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



还有一个有用的任务.

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

是你的情况吗?我们继续吧.

  1. 配置你的遥控器

跑:

$ git remote add origin url://your/repo.git
Run Code Online (Sandbox Code Playgroud)
  1. 准备将您庞大的本地Git存储库初始发送到远程存储库

默认情况下,你的Git不能发送大块. 致命:远程端意外挂断

让我们为它奔跑:

git config --global http.postBuffer 1073741824
Run Code Online (Sandbox Code Playgroud)

524288000 - 500 MB 1073741824 - 1 GB等

修复本地证书问题.如果您的git-server使用损坏的证书.

我已禁用证书.

您的Git服务器也可能需要更正请求数量限制.

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

使用本地Git运行:

git push origin --mirror
Run Code Online (Sandbox Code Playgroud)

(对于旧的Git版本,git push origin'*:*')

如果你得到以下内容:错误:无法生成git:没有这样的文件或目录 ...对我来说,我的存储库的完全重新创建解决了这个错误(30小时).您可以尝试下一个命令

git push origin --all
git push origin --tags
Run Code Online (Sandbox Code Playgroud)

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


krl*_*mlr 10

reposurgeon

对于复杂的病例,Eric S. Raymond的 reposurgeon 是首选工具.除SVN外,它还通过fast-export格式支持许多其他版本控制系统,还支持CVS.作者报告了EmacsFreeBSD等古代存储库的成功转换.

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

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


And*_*w B 8

atlassian网站上的这本指南是我发现的最好的指南之一:

https://www.atlassian.com/git/migration

这个工具 - https://bitbucket.org/atlassian/svn-migration-scripts - 对于生成authors.txt等非常有用.


小智 8

你必须安装

git
git-svn
Run Code Online (Sandbox Code Playgroud)

复制到此链接http://john.albin.net/git/convert-subversion-to-git.

1.检索所有Subversion提交者的列表

Subversion只列出每个提交的用户名.Git的提交有更丰富的数据,但最简单的是,提交作者需要列出名称和电子邮件.默认情况下,git-svn工具只会在作者和电子邮件字段中列出SVN用户名.但是通过一些工作,您可以创建所有SVN用户的列表以及他们相应的Git名称和电子邮件.git-svn可以使用此列表将普通的svn用户名转换为适当的Git提交者.

从本地Subversion结帐的根目录,运行以下命令:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
Run Code Online (Sandbox Code Playgroud)

这将获取所有日志消息,拔出用户名,消除任何重复的用户名,对用户名进行排序并将它们放入"authors-transform.txt"文件中.现在编辑文件中的每一行.例如,转换:

jwilkins = jwilkins <jwilkins>
Run Code Online (Sandbox Code Playgroud)

进入这个:

jwilkins = John Albin Wilkins <johnalbin@example.com>
Run Code Online (Sandbox Code Playgroud)

2.使用git-svn克隆Subversion存储库

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp
Run Code Online (Sandbox Code Playgroud)

这将执行标准的git-svn转换(使用您在步骤1中创建的authors-transform.txt文件)并将git存储库放在主目录中的"〜/ temp"文件夹中.

3.将svn:ignore属性转换为.gitignore

如果您的svn repo使用svn:ignore属性,您可以使用以下命令轻松将其转换为.gitignore文件:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'
Run Code Online (Sandbox Code Playgroud)

4.将存储库推送到裸git存储库

首先,创建一个裸存储库并使其默认分支匹配svn的"trunk"分支名称.

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk
Run Code Online (Sandbox Code Playgroud)

然后将临时存储库推送到新的裸存储库.

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
Run Code Online (Sandbox Code Playgroud)

您现在可以安全地删除〜/ temp存储库.

5.将"trunk"分支重命名为"master"

您的主开发分支将命名为"trunk",它与Subversion中的名称相匹配.您将要使用以下命令将其重命名为Git的标准"主"分支:

cd ~/new-bare.git
git branch -m trunk master
Run Code Online (Sandbox Code Playgroud)

6.清理分支和标签

git-svn将所有Subversions标签放入Git中非常短的分支,形式为"tags/name".您将要使用以下命令将所有这些分支转换为实际的Git标记:

cd ~/new-bare.git
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
Run Code Online (Sandbox Code Playgroud)

这一步将需要一些打字.:-)但是,别担心; 你的unix shell将为以git for-each-ref开头的超长命令提供>辅助提示.


web*_*mat 7

GitHub现在具有从SVN存储库导入的功能.不过,我从未尝试过.

  • GitHub的[当前推荐](https://help.github.com/articles/importing-from-subversion)是使用[另一个答案]中建议的`svn2git`程序(http://stackoverflow.com/a/4860157/470844). (3认同)

tho*_*ers 7

使用git,SVN和bash稍微扩展一下.它包括不与主干/分支/标签目录布局中使用的常规布局SVN仓库的步骤(SVN绝对没有强制执行这种布局).

首先使用此bash脚本扫描您的SVN仓库,以便为贡献的不同人员生成并为映射文件生成模板:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done
Run Code Online (Sandbox Code Playgroud)

使用此创建authors,您通过使用你的开发人员设置映射SVN用户名使用的用户名和电子邮件文件git config的属性user.nameuser.email(请注意,服务像GitHub的仅具有相匹配的电子邮件就足够了).

然后git svn将svn存储库克隆到git存储库,告诉它有关映射的信息:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

这可能需要很长时间,因为git svn将单独检查每个存在的标记或分支的每个修订版本.(请注意,SVN中的标签只是真正的分支,因此它们最终会在Git中出现).您可以通过删除SVN中不需要的旧标签和分支来加快速度.

在同一网络或同一服务器上的服务器上运行此功能也可以加快速度.此外,如果由于某种原因此过程中断,您可以使用它恢复它

git svn rebase --continue

在很多情况下,你在这里完成了.但是如果你的SVN repo有一个非传统的布局,你只需要在SVN中有一个目录,你想放入一个git分支,你可以做一些额外的步骤.

最简单的方法是在您的服务器上创建一个符合约定的新SVN仓库svn copy,并将您的目录放在trunk或分支中.这可能是唯一的方法,如果你的目录一直在回购的根目录,当我上次尝试这git svn只是拒绝做结帐.

你也可以使用git来做到这一点.对于git svn clone简单的使用目录要放在一个git的分支.

跑完之后

git branch --set-upstream master git-svn
git svn rebase
Run Code Online (Sandbox Code Playgroud)

请注意,这需要Git 1.7或更高版本.


小智 7

我已经发布了逐步指南(此处),将svn转换为git,包括将svn标记转换为git标签,并将svn分支转换为git分支。

简洁版本:

1)从特定的版本号克隆svn。(版本号必须是您要迁移的最早的版本)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame
Run Code Online (Sandbox Code Playgroud)

2)获取SVN数据。这是最耗时的步骤。

cd gitreponame
git svn fetch
Run Code Online (Sandbox Code Playgroud)

重复git svn fetch直到完成没有错误

3)更新主分支

git svn rebase
Run Code Online (Sandbox Code Playgroud)

4)通过复制引用从svn分支创建本地分支

cp .git/refs/remotes/origin/* .git/refs/heads/
Run Code Online (Sandbox Code Playgroud)

5)将svn标签转换为git标签

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done
Run Code Online (Sandbox Code Playgroud)

6)将存储库放在更好的位置,如github

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo
Run Code Online (Sandbox Code Playgroud)

如果您需要更多详细信息,请阅读我的帖子或询问我。


Pan*_*kaj 6

我们可以使用git svn clone如下命令.

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

上面的命令将从SVN提交创建作者文件.

  • svn log --stop-on-copy <SVN_URL>

在创建SVN项目时,上面的命令将为您提供第一个修订号.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

上面的命令将在本地创建Git存储库.

问题是它不会将分支和标签转换为推送.你必须手动完成它们.例如下面的分支:

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$
Run Code Online (Sandbox Code Playgroud)

对于标签:

$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$
Run Code Online (Sandbox Code Playgroud)

现在将master,branches和tags推送到远程git存储库.

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$
Run Code Online (Sandbox Code Playgroud)

svn2git实用程序

svn2git实用程序使用分支和标记删除手动操作.

使用命令安装它sudo gem install svn2git.之后运行以下命令.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

现在,您可以列出分支,标签并轻松推送它们.

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0
Run Code Online (Sandbox Code Playgroud)

想象一下,你有20个分支和标签,显然svn2git会为你节省很多时间,这就是为什么我比本机命令更喜欢它.它是本机git svn clone命令的一个很好的包装器.

有关完整示例,请参阅我的博客条目.


CAD*_*oke 5

TortoiseGit做到了。请参阅此博客文章:http : //jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

是的,我知道用链接回答不是很出色,但这是一种解决方案,是吗?


lef*_*ben 5

对于GitLab用户,我在这里列出了如何从 SVN 迁移的要点:

https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

从 SVN 迁移到 GitLab 的步骤

设置

  • SVN 托管于svn.domain.com.au.
  • SVN 可通过http(其他协议也可以)访问。
  • GitLab 托管git.domain.com.au于:
    • 使用命名空间创建组dev-team
    • 至少创建一个用户帐户并将其添加到组中,并且具有用于迁移的帐户的 SSH 密钥(使用 进行测试ssh git@git.domain.com.au)。
    • 该项目favourite-project是在dev-team命名空间中创建的。
  • 该文件users.txt包含相关的用户详细信息,每行一个用户,格式为username = First Last <address@domain.com.au>,其中username是 SVN 日志中给出的用户名。(有关详细信息,请参阅参考文献部分中的第一个链接,特别是用户 Casey 的回答)。

版本

  • 颠覆版本 1.6.17 (r1128011)
  • git版本1.9.1
  • 亚搏体育appGitLab版本7.2.1 ff1633f
  • Ubuntu服务器14.04

命令

git svn clone --stdlayout --no-metadata -A users.txt http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master
Run Code Online (Sandbox Code Playgroud)

就是这样!在 GitLab Web UI 中重新加载项目页面,您将看到现在列出的所有提交和文件。

笔记

  • 如果存在未知用户,该git svn clone命令将停止,在这种情况下, update users.txtcd favourite-project并将git svn fetch从停止的地方继续。
  • 需要 SVN 存储库的标准布局trunktagsbranches
  • 提供给该命令的 SVN URL在紧接、和git svn clone之上的级别停止。trunk/tags/branches/
  • git svn clone命令会产生大量输出,包括顶部的一些警告;我忽略了这些警告。


归档时间:

查看次数:

447538 次

最近记录:

5 年,12 月 前