首页 > 系统相关 >Windows下使用PowerShell一键SVN迁移至Git脚本

Windows下使用PowerShell一键SVN迁移至Git脚本

时间:2024-10-29 13:09:40浏览次数:3  
标签:SVN svn Git Windows -- git 迁移

目录

Git和SVN区别

  • SVN是集中式的,只有中央仓库。Git是分布式的,有本地和远程两仓库
  • SVN是按照文件存储,允许比较混乱的目录的目录结构,如果迁移前,不整理目录,会出现严重的文件混乱
  • SVN的分支是一个目录
  • Git有本地工作区、暂存区、远程仓库。因此代码提交到中央有区别

SVN先add提交到暂存,commit后直接到远程仓库
Git先add提交到暂存,commit后到本地仓库,最后push到远程仓库

Git的服务端与客户端介绍

Git客户端与SVN客户端选择

本教程使用的是Git作为Git客户端,TortoiseSVN作为SVN客户端。

迁移前的准备工作

  • 先在svn规整相关目录
svn路径 git路径
trunk master
tags tags
branches branches

例如在svn的branches有文件夹如下src、test,文件README.md,且历史提交记录里有publish文件夹,那么迁移到git后会生成src、test、publish等分支,但README.md文件会丢失

  • 准备users.txt文件,该文件是svn和git账户的映射关系。有了这个文件以后,会将svn的提交记录同步到git上,否则失败。如果是Visual SVN用户,请务必添加VisualSVN Server的相应映射。以下users.txt文件格式示例:
user=user<[email protected]>
test=test<[email protected]>
VisualSVN Server=admin<[email protected]>
  • 上述文件也可通过命令生成,需要进入svn项目目录生成,且生成的只有此项目的users.txt文件
# 这是powershell命令
svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} <{0}>" -f ($_ -split ' \| ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'users.txt' -Encoding utf8

通过生成的users.txt的文件只有此项目的。本迁移脚本需要所有用户的映射关系。迁移过程中,如遭遇xxxx not defined in ./users.txt file就是因为svn用户没在users.txt文件中定义,添加上即可

迁移脚本

  • 本脚本撰写时,svn服务器是被反代理出外网的,为了迁移快一点。会在本地局域网完成迁移以后,再改为远端地址
  • 如果迁移时遭遇如RPC failed; HTTP 413 curl 22 The requested URL returned error: 413,请检查自己的代理软件设置,比如nginx,需要设置client_max_body_size,设置最大请求长度即可。

本脚本基于powershell,且users.txt要求所有用户(包括已被删除的)映射关系,否则报错

# Git本地仓库目录
$gitPath = "D:\Git"
# git 本地Http路径
$gitLocalHttpUrl = "http://192.168.0.2:6610"
# git 远端Http路径,如果全是本地,可以改为和git本地Http地址一致即可
$gitRemoteHttpUrl = "https://git.youurl.com:6547"
# svn 本地Http路径
$svnLocalHttpUrl = "http://192.168.0.2:4782/svn"

# 项目名数组放这里
$data = @(
    [pscustomobject]@{
        # 项目名称
        name = "Project1";
    },
    [pscustomobject]@{
        name = "Project2";
    }
)

# 如果Git路径不存在,那么创建,如果路径已存在,不影响命令继续执行
if (![System.IO.Directory]::Exists($gitPath)) {
    md $gitPath
}

function migrate {
    param (
        [string]$projectName
    )
    # 项目路径
    $projectPath = "$($gitPath)\$($projectName)"
    # 推送分支的临时文件夹,迁移完成后可删除
    $projectBarePath = "$($gitPath)\$($projectName).bare"

    cd $gitPath
    git svn clone $svnLocalHttpUrl/$projectName --prefix=svn/ --no-metadata --trunk=/trunk --branches=/branches --tags=/tags  --authors-file "users.txt" $projectPath
   
    # 添加.ignore相关文件
    cd $projectPath
    git svn show-ignore --id=svn/trunk > .gitignore
    git add .gitignore
    git commit -m 'Convert svn:ignore properties to .gitignore.'

    # 准备迁移分支
    git init --bare $projectBarePath
    cd $projectBarePath
    git symbolic-ref HEAD refs/heads/svn/trunk

    # 推送分支到空目录
    cd $projectPath
    git remote add bare $projectBarePath
    git config remote.bare.push refs/remotes/*:refs/heads/*
    git push bare

    # 更正分支名
    cd $projectBarePath
    git branch -m svn/trunk master
    # 将svn标记迁移到git标记 这句代码要求严格的文件结构,如果不符合规范,会漏掉branches和tags
    # git for-each-ref --format='%(refname)' refs/heads/svn/tags | % { $_.Replace('refs/heads/svn/tags/','') } | % { git tag $_ "refs/heads/svn/tags/$_"; git branch -D "svn/tags/$_" }
    # 将所有svn分支创建为适当的git分支。这条命令会将所有branches、tags都创建为对应的git的branches,需要后期手动处理相关
    git for-each-ref --format='%(refname)' refs/remotes | % { $_.Replace('refs/remotes/', '') } | % { git branch "$_" "refs/remotes/$_"; git branch -r -d "$_"; }

    # 推送文件到远端
    git remote add origin $gitLocalHttpUrl/$projectName
    git push origin --all

    # 如果路径名不等,那么设置最新地址
    if (!"$($gitLocalHttpUrl)/$($projectName)".Equals("$($gitRemoteHttpUrl)/$($projectName)")) {
        git remote set-url origin $gitRemoteHttpUrl/$projectName
    }

    # 将.ignore单独推送,之前执行的命令会漏掉这个文件
    cd $projectPath
    git remote add origin $gitRemoteHttpUrl/$projectName
    git push origin --all
}

foreach ($curr in $data) {
    try {
        Write-Host 开始迁移 $curr.name 数据
        migrate -projectName $curr.name
    }
    catch {
        Write-Host "发生异常:$_"
        break
    }
}

本脚本主要参考以下教程

了解如何从 Subversion (SVN) 迁移到 Git(包括历史记录)
svn迁移到gitlab

标签:SVN,svn,Git,Windows,--,git,迁移
From: https://www.cnblogs.com/NickSmith/p/18512812

相关文章

  • windows7虚拟机无法上网问题
     环境:VMwareworkstation17虚拟机:wndows专业版本文旨在针对已完成好网络配置,确认可以实现宽带连接(如下图)情况下,浏览器仍然无法正常上网的情况前提(已有环境):已成功连接上宽带或者无线网络待解决问题:在已有宽带或者网络的前提下,仍然无法通过浏览器访问网站问题如下图:......
  • Git基本使用
    (1)下载安装Git前往git官网(https://git-scm.com/downloads)下载安装程序,按默认选项安装即可安装完成后,在应用中找到“GitBash”,出现一个类似命令行的窗口,说明git安装成功。可通过git–version查看当前git版本信息安装成功后,还需要设置name和email地址(2)Git本地仓库的创建......
  • windows平台有哪些好用的屏幕取词翻译工具
    windows平台好用的屏幕取词翻译工具:1.深度翻译(DeepL);2.划词翻译(Capture2Text);3.谷歌翻译(GoogleTranslate);4.考拉翻译(有道词典);5.欧路词典(eudic);6.轻译(QTranslate)。深度翻译是一款强大的翻译工具,不仅支持文本翻译,还能通过屏幕取词实现即时翻译。1.深度翻译(DeepL)深度翻译是一......
  • Windows将Redis安装为服务
    一、下载RedisWindows版Redis下载地址:https://github.com/MicrosoftArchive/redis/releases注:这是微软官方维护的将Redis移植到Windows平台,可能会落后于官方Redis的版本这里使用免安装版Redis官方下载地址(Linux/Unix版):https://redis.io/download二、安装服务......
  • LightningChart部署到Windows11某些电脑,无法启动问题
       问题经过注册表排查、SDK排查,均没有解决问题。   在可以运行的电脑上,全盘搜索LightningChat、Arction(厂家名称)比对,终于发现一个temp目录下的Arction.DirectX_32目录以及下边俩个dll:D3DCompiler_43.dll、d3dx11_43.dll,删除了就启动不了。   解决方案就是增......
  • git命令大全
    Git是一个开源的分布式版本控制系统,可以有效、高效地处理从小型到大型项目的版本管理。以下是Git的一些常见命令:配置Git的配置文件分为系统级、全局和项目级。系统级配置:gitconfig--systemuser.name"your_name"gitconfig--systemuser.email"[email protected]"......
  • 极狐GitLab 签约新大陆自动识别,以质量和安全让智能识别更精准
    关于新大陆自动识别福建新大陆自动识别技术有限公司(以下简称为新大陆自动识别)是新大陆科技集团的成员企业,是新大陆数字技术股份有限公司(股票代码:000997)的全资子公司。成立自1999年,当前已成为一家全球化的感知识别和机器视觉产品与解决方案提供商,拥有完全自主知识产权的条码核......
  • github下载加速[findstr修改hosts]
    @echooffremcolor1fsettitle=github下载加速[修改hosts]title%title%set"HOSTS_PATH=%windir%\system32\drivers\etc\hosts"REM备份原始的hosts文件copy"%HOSTS_PATH%""%HOSTS_PATH%.bak"rem使用findstr获取最后一行setnumber=0for/f"de......
  • windows DLL技术-DLL使用共享内存
    仅当加载DLL时,共享DLL内存才会保留。应用程序可以使用SetSharedMem和GetSharedMem函数访问共享内存。以下示例演示DLL入口点函数如何使用文件映射对象来设置可由加载DLL的进程共享的内存。实现共享内存的DLL该示例使用文件映射将命名共享内存块映射到加载DLL......
  • windows DLL技术-可执行文件的链接
    可执行文件通过以下两种方式之一链接到(或加载)DLL:隐式链接,其中操作系统会与使用DLL的可执行文件同时加载它。客户端可执行文件调用DLL的导出函数的方式与函数进行静态链接并包含在可执行文件中时的方式相同。隐式链接有时称为静态加载或加载时动态链接;显式链接,其中操......