我从初读手册、常见问题,混帐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

操SVN工作非常不同。你需要学习的统,并且如果你想跟踪变化,从SVN上,你需要学习 git-svn.的 git-svn 人页有一个很好的实例部分:

$ git svn --help

其他提示

创建一个用户的文件(即 users.txt)映射SVN用户文件

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数据储存库:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

这种命令将建立一个新的Git储存库中 dest_dir-tmp 并开始拉SVN库。注意"--stdlayout"标志意味着你有共同的"中继/、分支机构/标签/"SVN布局。如果你布置的不同而不同,熟悉 --tags, --branches, --trunk 选项(一般 git svn help).

所有共同协议是允许的: svn://, http://, https://.URL应该目标的基储存库,类似的东西 http://svn.mycompany.com/myrepo/repository.必须 包括 /trunk, /tag/branches.

注意到在执行这一命令也常常看起来像的动作是"挂/冻结",这是相当正常的,它可以坚持很长一段时间的初始化后的新的储存库。最终你会看到记录的消息,这表明它的迁移。

还注意到,如果忽略的 --no-metadata 标志,发生了错误,追加信息的相应的SVN修订的提交信息(即 git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

如果一个用户名是找不到更新你的 users.txt 文件:

cd dest_dir-tmp
git svn fetch

你可能要重复这一最后的命令几次,如果你有一个大型项目,直到所有的颠复提交已经取:

git svn fetch

当完成后,发生了错误的结账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

标记是进口的,为的分支机构。你必须创建一个当地的分行,作一个标签,并删除该分行有他们作标记在饭桶。要做到这一标签"v1":

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

克隆你的混帐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

干净迁移颠复库个混库.首先,你必须创建一个文件,你的地图颠复犯提交人的名字件commiters说 ~/authors.txt:

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

然后你可以下载的颠复数据纳入个混库:

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

如果你在一个麦克,你可以得到 git-svn 从MacPorts通过安装 git-core +svn.

如果你的颠复仓库是在同一台机器上你所需的内容代码 然后你可以用这种语法的初始步骤,否则所有的相同的:

git svn init file:///home/user/repoName --no-metadata

我用的 svn2git脚本 就像一个特色。

我建议得到舒适}类之前试图使用混帐svn不断,即保持SVN作为集中回购和令。

然而,对于一个简单的移徙与所有的历史,这里有几个简单的步骤:

初始化的当地回购:

mkdir project
cd project
git svn init http://svn.url

标记如何早你要开始进口的修订:

git svn fetch -r42

(或只是"混帐svn取"所有雄)

实际取一切从那以后:

git svn rebase

你可以检查的结果进与Gitk.我不知道这是否适用于Windows,它适用于OS x和Linux:

gitk

当你得到了你的SVN库克隆在当地,你可能想把它推到一个集中的混帐回购协议,为了更易于合作。

第一次创建空遥远的回购协议(可能在 ?):

git remote add origin git@github.com:user/project-name.git

然后,选择地同步主要分支,所以拉动操作,将自动合并的远程掌握与当地的主人,当既包含新的东西:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

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

首先说明职:"Git远程枝"

后续行动的最近版本:"时下的合作与git_remote_branch"

有一个新的解决方案,为顺利迁移,从颠复件(或对于使用者同时): SubGit.

我工作上的这个项目我自己。我们使用SubGit在我们的仓库-一些我的队友的使用操作的某些颠复和到目前为止,它工作得很好。

迁移,从颠复件与SubGit你需要运行:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

在那之后你会得到Git库svn_repos/.操可能进行克隆,或只是继续使用颠复和这一新的Git仓库一起:SubGit将确保始终保持同步。

在情况下颠复你的储存库包含多个项目,然后多Git库将建立在svn_repos去目录。来自翻译之前的运行做到以下几点:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

SubGit 你可以迁移到纯Git(不混帐svn),并开始使用它,同时仍保持颠复只要你需要它的(你已经配置的建造工具,例如)。

希望这可以帮助!

看到官方的 混帐svn平.特别是,看看在"基本的实例":

跟踪和促进一个整个颠复管理的项目(完成 用树干、标签和分支机构):

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

SubGit (vs的死亡)

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

这是所有。

+以更新,从SVN,个混库创建的第一命令。

subgit import  directory/path/Local.git.Repo

我用的方式迁移件立即对于一个巨大的储存库。
当然你需要一些准备工作。
但是你可以不停止发展过程中,在所有。

这里是我的方式。

我的解决方法看起来像:

  • 迁移SVN到个混库
  • 更新的版本库之前只是团队的切换到.

迁移需要大量的时间用于一个大SVN库。
但更新的完成迁移,只需几秒钟。

当然我用的 SubGit, 妈妈混帐svn让我 蓝色的屏幕上的死亡.只是不断的。和混帐svn是我无聊}类的"文件太长"致命的错误。

步骤

1. 下载SubGit

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

让我们说我们做到这一为Windows(这是琐碎的口到Linux)。
在SubGit的安装 目录(subgit-2.X.X\bin),创建两个。蝙蝠文件。

内容的文件的命令迁移:

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

"开始"的命令是可选的在这里(Windows)。它只允许看上的错误开始,并留下一个壳开完成后的SubGit.

你可以添加在这里 其他参数,类似于混帐svn.我只使用 --default-domain myCompanyDomain.com 修复的领域的电子邮件地址的SVN作者。
我已经标准SVN储存库的结构(中继/分支机构/标记),我们没有麻烦"作者mapping".所以我什么都不做任何的更多。

(如果你想要迁移标记像树枝或者你SVN有多个分支机构/标签的文件夹你可以考虑使用更详细的SubGit 的办法)

尖端1:使用--最小的-修订YourSvnRevNumber见到的快速如何的事情沸腾出的(某种类型的调试)。特别有用的是要看到解决作者姓名或电子邮件。
或限制移徙的历史的深度。

尖端2:迁徙可能会中断(Ctrl + C)恢复通过运行的下一次更新命令/文件。
我不建议这样做对大储存库。我已收到"的存Java+Windows例外"。

尖端3:更好地为创建一个复制的结果裸库。

内容的文件的命令更新:

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

你可能运行它的任何金额的时候,你要得到的最后一个团队的承诺仓库的内容。

警告! 不要摸你的裸库(设立分支机构为例)。
您将采取的下一个致命的错误:

不可恢复的错误:是同步的,不能同步...翻译颠复的订正中提交对象的...

3. 运行的第一命令/文件。它将采取下次时间为一个大的储存库。30个小时我卑微的储存库。

这是所有。
你可能更新仓库从SVN在任何时间任何时间运行的第二文件/指令。与之交换的开发团队饭桶。
这将需要几秒钟内。



还有一个更有用的任务。

把你的地方Git仓库,一个远程仓库

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

  1. 配置的遥控器

运行:

$ git remote add origin url://your/repo.git
  1. 准备最初发送你的庞大的当地Git仓库以远程数据库

通过默认仓不能送大的区块。致命的:远程端挂了意外

让我们运行为:

git config --global http.postBuffer 1073741824

524288000-500兆 1073741824-1GB,等等。

修复你的地方 证书的麻烦.如果你的混帐服务器使用一个破碎的证书。

我已禁用 证书.

还仓服务器可能有一个 请求数量限制,需要纠正.

  1. 推动所有移徙 为团队的远程仓库。

运行与一个当地的文件

git push origin --mirror

(git推动原籍'*:*' 对于老版本)

如果你会得到如下: 错误:不能产生文件没有这样的文件或录...对我的全的娱乐我的储存库,解决了这个错误(30小时)。你可以尝试下一个命令

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

或者尝试 重新安装Git (对我来说无用).或者你可以建立分支机构从你的标记和推动他们。或,或或,或...

reposurgeon

对于复杂的情况下,通过reposurgeon Eric S.雷蒙德 是的首选工具。此外,SVN,它支持许多其他版本控制系统通过 fast-export 格式,并且还 CVS.作者报告的成功转换的古老的储存库(例如 EmacsFreeBSD.

该工具显然 目的是在接近完美转换 (诸如转换SVN的 svn:ignore 属性 .gitignore 文件),甚至对于难以储存库的布局有一个很长的历史。对于许多情况下,其他工具可能更容易使用。

之前的深入研究文档的 reposurgeon 命令行,一定要读的优秀 DVC迁移指南 其中超过转换过程中一步步骤。

本指南在讨论大多数集中的网站是一个最好的我已经发现:

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

这个工具- https://bitbucket.org/atlassian/svn-migration-scripts -还真的有用的产生您authors.txt 除其他事项。

你必须安装

git
git-svn

复制从这个链接 http://john.albin.net/git/convert-subversion-to-git.

1.检索的一个列表中的所有颠复提交者

颠复简单地列出了用户名对于每个提交。Git的承诺具有更丰富的数据,但在其最简单的,该承诺提交人的需要有一个姓名和电子邮件列出。通过默认的混帐svn工具将只是列出SVN用户名在这两个作者和电子邮件领域。但有一点点的工作,您可以创建一个列表中的所有SVN用户及他们的相应Git名和电子邮件。这个名单可以使用的混帐svn改变纯svn用户名成适当的Git提交者。

从根本地的颠复结账,运行这一命令:

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

会抓住所有的日志信息,拔出来的用户名,消除任何重复的用户名,排序的用户名和将它们放入一个"authors-transform.txt"文件。现在编辑每个行在该文件。例如,转换:

jwilkins = jwilkins <jwilkins>

到这个:

jwilkins = John Albin Wilkins <johnalbin@example.com>

2.克隆版本库使用混帐svn

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

这将做的标准混帐svn转化(使用authors-transform.txt 文件你创建的步骤1)和地方版本库中的"~/temp"的文件夹里你的家目录。

3.转换svn:忽略特性。gitignore

如果你svn库是使用svn:忽略性质,可以很容易地转换成本。gitignore文件的使用:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4.推储存库的一个裸版本库

第一,创建一个裸露的储存库,并使它的默认支配svn的"中继"分的名称。

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

然后推的临时储存库为新的赤裸的储存库。

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

你现在可以安全地删除~/临时储存库。

5.重新命名"主干"分支"主人"

你的主要发展分支将被命名为"干",其名称匹配的是,在颠复活动。你会想要重新命名它件的标准的"主人"分使用:

cd ~/new-bare.git
git branch -m trunk master

6.清理分支和标签

混帐svn使所有的颠复标签进入非常短的分支的形式"的标签/名称"。你要把所有这些分支机构成实际的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

这一步骤将采取一些输入。:-),但是,不用担心;你的unix壳将提供一个>二次提示的超长的命令,开始与工-每--ref.

但现在有一个特点, 进口从SVN库.我从来没有尝试过,虽然。

一个有所延长的答案只用git,SVN,并抨击。它包括的步骤SVN储存库,不要使用传统布局中继/分支机构/标记的布局目录(SVN也绝对没有什么强制执行这种布局)。

第一次使用这个砸脚本来扫描你的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

使用此创建一个 authors 文件在哪里你的地图svn用户名用户名和电子邮件作组通过开发人员使用 git config 性能 user.nameuser.email (注意,等服务的审查仅具有匹配的电子邮件就足够了)。

然后有 git svn 克隆svn库个混库,告诉它关于制图:

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

这可以采取的令人难以置信的,因为git svn将单独地检查了每一个修订的每个标记或分支的存在。(注意,标记在SVN都是真的分支机构,使他们最终因为这种Git).你可以加速这一通过删除旧的标签和分支机构在SVN你不需要。

运行这个服务器上在同一网络上或同一服务器也可以真正加快这一行动。此外,如果由于某种原因,这个过程被打断你 可以 恢复它的使用

git svn rebase --continue

在很多情况下,你在这里完成。但如果你SVN回购了一个非常规的布局,你只有一个目录在SVN你想放在一个跟踪你可以做一些额外的步骤。

最简单的就是使一个新的SVN回购你的服务器上,并按照《公约》和使用 svn copy 把你的录在后备箱或一个分支。这可能是唯一的办法了,如果你的目录是所有的方式在根的仓库,当我最后一次尝试这种 git svn 简单地拒绝一个结帐。

你也可以这样做使用的饭桶。对于 git svn clone 简单地使用目录你想放在一个混帐的分支。

后运行

git branch --set-upstream master git-svn
git svn rebase

注意,这需要Git1.7或更高。

我已经发布一步一步的指导(在这里,)转换svn在件包括转换svn标签件的标签和svn分支机构在件分支机构。

短短的版本:

1)克隆svn从一个具体的修订数量。(修订数量必须是最古老的要迁移)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2)取svn数据。这一步骤这是一个需要最多的时间。

cd gitreponame
git svn fetch

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

3)得到主分支的更新

git svn rebase

4)创建地方分支机构从svn分支机构通过复制文献

cp .git/refs/remotes/origin/* .git/refs/heads/

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

6)把一个仓库在一个更好的地方想想

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

如果你想要的更多细节,请参阅我的 或问我。

我们可以使用 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 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
$

对标签:

$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
$

现在推动的主人,分支和标签的远程仓库。

$ 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
$

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

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

对于一个完整的例子,请参阅我的 博客入口.

TortoiseGit这样做。看看这篇文章: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

是啊,我知道回答的链接不是灿烂但它是一个解决方案,是吗?

我强烈推荐这个 系列简短的视频 我刚刚发现的。提交人指导你穿过基本操作,并展示了一些更高级的用途。

如果您使用的是SourceTree你可以这样做,直接从应用程序。Goto文件>新的/克隆那么做如下:

  1. 输入远程SVN URL为"源Path/URL"。
  2. 请输入您的凭据。
  3. 进入当地的文件夹中的位置"的目的地的道路"。
  4. 给它一个名称。
  5. 在先进的选项中选择"混帐"从拉在"创建地方 储存库的类型"。
  6. 你可以选择指定一个订正的克隆。
  7. 打克隆。

打开仓库在SourceTree你会看到你的提交信息已被迁移。

现在去仓库->库的设置和添加新的远程回购的详细信息。删除SVN遥如果你愿意(我这样做过"的编辑配置文件"的选项。

推动代码,以新的远程回购协议当你准备和代码自由。

对于 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日志。(见第一链接引用部分的详细信息,特别是答案通过用户凯西).

版本

  • 颠复版1.6.17(r1128011)
  • git版1.9.1
  • GitLab版7.2.1ff1633f
  • Ubuntu服务器14.04

命令

bash
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

这就是它!重新载入页的项目在GitLab网用户界面和你会看到所有提交的文件现在列出。

注意到

  • 如果有未知的用户, git svn clone 命令将停止,在这种情况下,更新 users.txt, cd favourite-projectgit svn fetch 将继续从它停止。
  • 标准 trunk-tags-branches 布局SVN库是必需的。
  • SVN URL给 git svn clone 命令停止在该水平上 trunk/, tags/branches/.
  • git svn clone 命令产生一个很大的输出,包括一些警告在顶端;我忽略了警告。

作为另外,混帐藏匿的命令是天赐之物的时候,试图下与混帐svn dcommits.

一个典型的过程:

  1. 设立混帐回购协议
  2. 做一些工作,在不同的文件
  3. 决定要检查的一些工作,令
  4. 决定 svn-dcommit
  5. 获得可怕"不能提交一个肮脏的指标"的错误。

解决(需要git1.5.3+):

git stash; git svn dcommit ; git stash apply

这是一个简单壳脚本没有依存关系,将一个或多个SVN库件,并推动他们想.

https://gist.github.com/NathanSweet/7327535

在大约30线的脚本:克隆令SVN,创建一个.gitignore文件从SVN::忽视的特性,推动到一个裸露的内容代码重新命名SVN干掌握,将SVN标签件的标签,并推动它,但同时保留的标签。

我去过很多的痛苦动打SVN库从Google的代码想.它没有帮助,我使用的窗口。红宝石是各种各样的破我的旧Debian箱并让它的工作上窗户是一个笑话。其他解决方案失败工作与Cygwin路径。即使是一旦我得到了什么工作,我不知道如何获得的标记上显示的审查(秘诀就是--遵循-标签)。

在结束我拼凑起来的两个短期和简单的脚本链接上,以及它的伟大工程。解决方案不需要任何更复杂!

Im在windows的机器,并提出了一小批量转让SVN回购的历史(但没有分支机构),以一种混帐回购协议,由只是打电话

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

也许有人可以使用它。它创建了一个TMP-夹检查出SVN回购有与操作增加了新的原产地,并推动它...并删除该文件夹。

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

你仍然需要users.txt 用你的用户的映像

User1 = User One <u.1@xxx.com>

我只想补充我的贡献,从初社区。我写了一个简单的bash脚本,这自动化的全部进口。不同于其他移徙工具,该工具依赖于本机git而不是用当中,但现.这个工具还支持库大修订历史和或大blob。它可以通过审查:

https://github.com/onepremise/SGMS

这个脚本,将其转换项目的存在SVN与以下格式:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

这个方案也是受欢迎和支持,以及:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

每个项目将得到同步的,通过项目名称:

Ex: ./migration https://svnurl.com/basepath project1

如果你想转换的完整回购过,使用的语法如下:

Ex: ./migration https://svnurl.com/basepath .

有效地令与颠复 是一个温和的介绍混帐svn.对于现有SVN库,混帐svn让这个超级容易。如果你在开始一个新的储存库,这是极容易首次创建一个空SVN存储库,然后进口使用混帐svn于它是要在相反的方向。创建一个新的Git仓库,然后进口到SVN可以做到的,但它是一个有点痛苦,尤其是如果你是新来的混蛋,希望维护的承诺的历史。

下载的红宝石的安装窗户和安装最新版本。加红宝石可执行文件要你的路径。

  • 安装svn2git
  • 开菜单->的所有程序->红宝石>启动一个命令与红宝石
  • 然后键入"宝石的安装svn2git"和输入

    迁移的版本库

  • 开一家红宝石的命令迅速和去目录的文件是要迁移

    然后svn2git http://[域 名]/svn/[库根]

  • 这可能需要几个小时迁移的项目下取决于项目的代码的大小。

  • 这一重大步骤有助于创造版本库的结构如下所述。

    SVN(/Project_components)继-->Git主 SVN(/Project_components)分支机构-->Git分支 SVN(/Project_components)标签-->Git标签

创建远程数据库并推动改变。

但有一个进口国。一旦你已经创建了储存库,可以从现有的储存库,通过其网址。它将要求您的凭证,如果适用,并从那里走。

因为它的运行,它将找到提交人,你可以简单地图,他们的用户在想.

我已经用它的一些仓库,现在,这是非常准确和更快的!它花了10分钟为一个储存库约为4000承诺,之后它花了我的朋友四天!

几个答案在这里提到 https://github.com/nirvdrum/svn2git, ,但是对于大型储存库,这可以是缓慢的。我有一个尝试使用 https://github.com/svn-all-fast-export/svn2git 相反,它是一个工具,具有完全相同的名称,但是用于迁移KDE从SVN到饭桶。

稍微更多的工作来设置,但是当完成了转换自己为我分钟了其他的脚本中所花的小时。

有不同的方法来实现这一目标。我已经试过一些他们发现真正的工作一个只操svn上安装了Windows操作系统。

先决条件:

  1. git on windows(我采用这一) https://git-scm.com/
  2. svn与控制台工具安装(我用龟svn)
  3. 甩文件SVN库。svnadmin dump /path/to/repository > repo_name.svn_dump

步骤,以实现的最终目标(移动的所有储存库,与历史上一个混帐,首先当地git,然后远程)

  1. 创造空的仓库(使用控制台工具或如今)在目录REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, 把转储文件.转储到REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump 等待这种操作,它可以长久

  3. 这个命令是无声的,因此开cmd第二窗口: svnserve -d -R --root REPO_NAME_FOLDER 为什么不只是使用的文件:///......?导致下一个命令将失败 Unable to open ... to URL:, 由于答案 https://stackoverflow.com/a/6300968/4953065

  4. 创建新的文件夹SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn克隆svn://localhost/等待这种操作。

最后,我们得到什么?

让我们检查我们的地方储存库:

git log

看看你先前提交?如果是的-好吧

所以现在你有功能齐全的地方git仓库与你的来源和老svn的历史。现在,如果你想要把它移到一些服务器上,使用以下命令:

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

在我的情况下,我不需要标记的命令,因为我的回购协议没有标记。

祝你好运!

转换svn子模块/文件夹MyModule'入git与历史上没有标签,也没有分支机构。

保留svn忽略名单使用的上述意见之后的步骤1

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top