如何在Windows上将svn存储库转换为git

时间:2012-01-06 16:31:22

标签: windows git svn

我们有远程svn存储库,我们希望它转换为git。 你能告诉我在Windows上怎么做? 感谢。

4 个答案:

答案 0 :(得分:1)

在Windows上安装应用程序:

找出svn存储库URL并将其复制

这样的事情:
enter image description here

调用TortoiseGit克隆对话框

右键点击目标文件夹,例如D:\SVN\ToGit,然后点击Git Clone...
enter image description here

选中From SVN repository复选框

enter image description here

如果您先复制了URL,然后调用克隆对话框,TortoiseGit将从剪贴板中获取复制的URL并将其粘贴到URL文本字段中。所以,你不要自己粘贴它。只要看看它是否正确。

如果您右键单击目标文件夹,TortoiseGit也会为您填写Directory文本字段。另外,看看它是否是你想要的。

因此,只需选中From SVN repository复选框即可。

如果svn存储库具有标准布局,例如主干,标签,分支机构,则不需要再做任何事情。

点击“确定”按钮

然后,开始将svn存储库克隆到git存储库 像这样:

enter image description here

正如您所看到的,TortoiseGit恰当地使用Git for Windows命令git svn clone来克隆它。

git.exe svn clone "svn://svn.code.sf.net/p/tortoisesvn/code/" "D:\SVN\ToGit\tsvn" -T trunk -b branches -t 

所以,基本上,你可以去 Git Bash / CMD 并重新使用该命令行,并获得相同的结果。

注意:如果您看到r1r2r3 ...,您可以随时停止克隆,稍后再继续使用相同的命令行。

克隆本地svn存储库

使用TortoiseGit 2.4.4 +

只需将svn本地路径复制到克隆对话框的URL即可。请参阅:
enter image description here
同样,选中From SVN repository复选框

克隆:
enter image description here

TortoiseGit 2.4.4 + 将使用 file:///协议来克隆本地svn存储库。

获得git存储库后,可以在那里提交。并使用TortoiseGit -> SVN DCommit... 将提交推送回原始svn存储库,类似svn commit

enter image description here

enter image description here

如您所见,命令为git svn dcommit

如果原始svn存储库有一些新的提交需要更新,您可以使用TortoiseGit -> SVN Rebase 来获取svn提交然后合并/ rebase在最新的提交。类似于svn update

enter image description here

它使用git svn fetch然后使用git rebase合并/重新定义所提取的更改。

enter image description here

对于命令行,您可以使用git svn rebase

阅读Pro Git v2 - Chapter 9了解更多信息和示例。

答案 1 :(得分:0)

您可以使用git-svn这是一个允许您将svn存储库转换为git存储库的工具。有关详细信息,请参阅git documentation

答案 2 :(得分:0)

上下文: 带有多个项目的巨大存储库的远程svn服务器。但是我只想将一个项目从SVN迁移到Git

这是我的做法:

要求:

  1. Git扩展-Git Extensions
  2. Visual SVN服务器(也获得评估许可证)-Visual SVN Server
  3. 巧克力Windows软件包管理器-Chocolatey
  4. Git版本2.6.2(在cmd中使用Chocolatey:choco install git --version 2.6.2)

做什么:

1。获取致力于作者文件的用户

打开cmd到本地svn项目副本的根目录并运行:

svn log -q | awk -F'|' '/ ^ r / {sub(“ ^”,“”,$ 2); sub(“ $”,“”,$ 2);打印$ 2“ =” $ 2“ <” $ 2“>”}''|排序-u> authors-transform.txt

将生成的作者文件放在您可以找到的位置

打开并编辑authors-transform.txt文件,方法是为每个提交者逐行添加名称和电子邮件到<>中


2。将服务器上的SVN存储库复制到工作驱动器上的本地(例如:c:/ repo / Repository


3。安装Visual SVN,并将服务器的存储指向/ repo文件夹

还找到了一个开放的端口供其运行

设置对服务器的Windows身份验证的权限 您可能还需要为服务器创建一个用户 同时为您的用户设置服务器中特定项目的权限

4。在新克隆的SVN存储库保留移位的目标文件夹中,单击Git浏览以打开Git扩展,转到“开始”,然后单击“克隆SVN”

指向您为目标创建的本地svn服务器(例如http://localhost/svn/repo/Repository/Development/ProjectName

我没有选中树干,标签和分支,但是YMMV

将作者文件指向保存位置

点击克隆


原因:

Git 2.6.2,因为它是最新版本,没有引起地址问题

Git扩展,因为它最小化了克隆的所有命令行工作

Visual SVN,因为我在服务器上遇到权限问题,并且“ git svn”命令对http://localhost .....地址的响应比在许多地方建议的file://更好。研究过

巧克力,因为我没有其他方法可以获取该版本的Git

答案 3 :(得分:0)

我最终做了这么多,我制作了一个批处理脚本来提供帮助:

用法:SvnToGit <path/to/svn-repo> <local-checkout-dir> <remote-git-url>

先决条件

  • 您应该已经具有指向空git远程存储库的URL。
  • 您应该在根目录下已有一个authors.txt文件,以准备 去。
  • 除非Git理解您的svn格式,否则您将需要运行 svnserve“服务”回购。您可以创建一个窗口服务来做, 像这样的东西:

    c:> sc创建svnserve binpath =“ \” svnserve.exe \“ --service -r C:\ Users \ UserName \ Repositories \ Svn” displayname =“ Subversion Server” depend = Tcpip start = auto

注意事项:

  • 检查中间结果,有时可能会失败
    (尤其是svn克隆)。
  • 请注意有关手动更改的部分(如果需要) 标签。也许可以在批处理文件中完成,但似乎 复杂而不是我的优先考虑。这里有一个暂停,所以
    您可以手动进行这些更改。
  • 我尚未在许多系统上进行过测试,您可能需要进行调整 该脚本要适应您的系统。

实际的批处理文件:

REM Argument 1: Path to your repository
REM Argument 2: Path to your new Git working directory
REM Create authors.txt file
REM It will contain lines like:
REM SomeCoder = Some Guy <some.guy@example.com>
REM If Git is now aware of the format of svn repository, you will need to use svnserve:
REM svnserve -d -R --root path/to/your/repository
PAUSE

IF EXIST bare.git\NUL RD /S /Q bare.git
IF EXIST GitTemp\NUL RD /S /Q GitTemp

REM The following will not work, if SVN is using a newer FS than what Git is aware of
REM git svn clone file:///%1 --prefix=svn/ --no-metadata -A authors.txt --stdlayout GitTemp
REM So, use
git svn clone svn://localhost/%1 --prefix=svn/ --no-metadata -A authors.txt --stdlayout GitTemp
PAUSE

REM GitIgnore
cd GitTemp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m "Convert svn:ignore properties to .gitignore."
cd ..

REM Bare Repo
git init --bare bare.git
cd bare.git
git symbolic-ref HEAD refs/heads/trunk
cd ..

cd GitTemp
git remote add bare ../bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare master
cd ..

REM clean up SVN type stuff
cd bare.git
REM git branch -m trunk master
git branch -m svn/trunk master
git symbolic-ref HEAD refs/heads/master
cd ..

REM Manual changes if needed for tags
REM git for-each-ref --format='%(refname)' refs/heads/tags |
REM cut -d / -f 4 |
REM while read ref
REM do
REM   git tag "$ref" "refs/heads/tags/$ref";
REM   git branch -D "tags/$ref";
REM done
PAUSE

REM Working Directory
git clone bare.git %2

cd %2
git checkout master

git remote remove origin
PAUSE

git remote add origin %3
REM Then
git push -u origin master