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

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


当前回答

下载适用于Windows的Ruby安装程序并安装最新版本。将Ruby可执行文件添加到路径中。

安装svn2git开始菜单->所有程序->Ruby->使用Ruby启动命令提示符然后键入“geminstallsvn2git”并输入迁移子版本存储库打开Ruby命令提示符并转到要迁移文件的目录然后svn2git http://[domainname]/svn/[repository root]将项目迁移到Git可能需要几个小时,具体取决于项目代码大小。这一主要步骤有助于创建如下所述的Git存储库结构。SVN(/Project_components)主干-->Git主机SVN(/Project_components)分支-->Git分支SVN(/Project_components)标记-->Git标记

创建远程存储库并推送更改。

其他回答

您必须安装

git
git-svn

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

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

Subversion只列出每次提交的用户名。Git的提交有更丰富的数据,但最简单的是,提交作者需要列出姓名和电子邮件。默认情况下,git-svn工具只会在author和email字段中列出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

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

jwilkins = jwilkins <jwilkins>

在这方面:

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

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

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

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

3.转换svn:忽略财产到.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.'

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

首先,创建一个裸存储库,并使其默认分支与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

现在可以安全地删除~/temp存储库。

5.将“trunk”分支重命名为“master”

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

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

6.清理树枝和标签

git-svn将所有Subversion标记都转换为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

这一步需要输入一些信息。:-)但是,不要担心;unixshell将为以git-for-each-ref开头的超长命令提供>辅助提示。

Pro Git 8.2对此进行了解释:http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git

为此,我使用了svn2git库,过程如下:

sudo apt-get安装git-core git-svn-rubysudo gem安装svn2gitsvn log--quiet|grep-E“r[0-9]+\|.+\|”|cut-d'|'-f2|sed's///g'|sort|uniq>authors.txt(此命令用于映射作者)

以上步骤应该在要从svn转换为git的文件夹中执行。

在authors.txt中每行添加一个映射,如下所示

anand = Anand Tripathi <email_id>
trip = Tripathi Anand <email_id>

为新的git存储库创建一个文件夹,并执行以下命令,路径为authors.txt

svn2git <svn_repo_path> --nobranches --notags --notrunk --no-minimize-url --username <user_name> --verbose  --authors <author.txt_path>

If no trunk and no tag and branch is present then have to execute the above command else if root is trunk then mention rootistrunk or trunk is present then --trunk <trunk_name>

git远程添加原点git push—所有原点git push—标记原点

从Subversion到Git(或同时使用两者)的平滑迁移有一个新的解决方案:SubGit。

我自己在做这个项目。我们在我们的存储库中使用SubGit——我的一些队友使用Git和一些Subversion,到目前为止它工作得很好。

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

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

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

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

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

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

希望这有帮助!

我在一台windows机器上,通过调用

传输.bathttp://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

也许任何人都可以使用它。它创建了一个TMP文件夹,用git签出SVN repo,添加新的来源并推送它……然后再次删除文件夹。

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