繁体   English   中英

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

[英]how to convert svn repository to git on Windows

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

在Windows上安装应用程序:

找出svn存储库URL并复制它

像这样的东西:
在此输入图像描述

调用TortoiseGit克隆对话框

右键单击目标文件夹,例如D:\\SVN\\ToGit ,然后单击Git Clone...
在此输入图像描述

选中From SVN repository复选框

在此输入图像描述

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

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

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

如果svn存储库具有标准布局,比如trunk,tags,branches,则不需要再做任何事情。

单击“确定”按钮

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

在此输入图像描述

正如您所看到的,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中即可。 看到:
在此输入图像描述
再次, 选中From SVN repository复选框

克隆:
在此输入图像描述

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


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

在此输入图像描述

在此输入图像描述

如您所见,该命令是git svn dcommit

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

在此输入图像描述

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

在此输入图像描述

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


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

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

我是这样做的:

要求:

  1. Git扩展 - Git扩展
  2. Visual SVN Server(也获得eval许可证) - Visual SVN Server
  3. Chocolatey 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); print $ 2“=”$ 2“<”$ 2“>”}'| sort -u> authors-transform.txt

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

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


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


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

还可以找到一个可以运行的开放端口

将身份验证的权限设置为服务器的窗口您可能还必须为服务器创建用户还要为用户设置服务器中特定项目的权限

4.在新克隆的SVN repo hold shift的目标文件夹中,单击Git Browse打开Git Extensions,转到“开始”,然后单击“克隆SVN”。

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

我取消选中了行李箱,标签和分支,但YMMV

将authors文件指向保存的位置

单击克隆


原因:

Git 2.6.2,因为它是最新版本,不会导致地址问题

Git Extensions因为它最大限度地减少了克隆的所有命令行工作

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

巧克力,因为我没有看到任何其他方式来获得该版本的Git

我最终做了这么多,我做了一个批处理脚本来帮忙:

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

先决条件

  • 您应该已经拥有空git远程存储库的URL。
  • 您应该在根目录中预先存在authors.txt文件。
  • 除非Git理解你的svn格式,否则你需要运行svnserve来“服务”repo。 你可以创建一个窗口服务,如下所示:

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

注意事项:

  • 检查中间结果,偶尔可能会失败
    (特别是svn克隆)。
  • 如果标签需要,请注意手动更改部分。 也许,这可以在批处理文件中完成,但它似乎很复杂,对我来说不是一个高优先级。 这里有一个PAUSE,所以
    您可以手动进行这些更改。
  • 我没有在许多系统上测试过这个,你可能需要稍微调整一下脚本以适应你的系统。

实际的批处理文件:

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

您可以使用git-svn这个工具,它允许您将svn存储库转换为git存储库。 有关更多信息,请参阅git文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM