> For the complete documentation index, see [llms.txt](https://monksoul.gitbook.io/hoa/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://monksoul.gitbook.io/hoa/er-shi-jiu-git-dai-ma-guan-li/29.15svn-zhuan-git.md).

# 29.15、Svn 转 Git

## 可使用框架提供的自动化脚本

```bash
$SoucePath = Read-Host "请输入仓库目录，可空";
$SvnAddress = Read-Host "请输入Svn地址，可空";
$GitAddress = Read-Host "请输入Git地址，可空";

# 记录当前脚本目录
$pspath=pwd;

if($SvnAddress -eq $null -or $SvnAddress -eq "" -or $GitAddress -eq $null -or $GitAddress -eq "")
{
    echo "sync svn to git.";

    if($SoucePath -eq $null -or $SoucePath -eq "")
    {
        throw "[-SoucePath] can not be empty.";
    }

    # 进入源码目录
    pushd $SoucePath;

    # 如果 local-git-svn 分支存在才执行这条命令
    git branch -d local-git-svn;

    # 创建分支并切换到 local-git-svn
    git checkout -b local-git-svn  refs/remotes/git-svn;

    # 拉取SVN最新修改代码
    git svn fetch;

    # 切换回主分支
    git checkout master;

    # 再删除分支 local-git-svn
    git branch -d local-git-svn;

    # 再重写创建分支并切换到 local-git-svn
    git checkout -b local-git-svn  refs/remotes/git-svn;

    # 切换回主分支
    git checkout master;

    # 合并最新代码到 master 分支
    git merge local-git-svn;

    # 推送到远程
    git push -u origin master;
}
else
{
    write-warning "The first time sync svn to git.";

    if($SvnAddress -eq $null -or $SvnAddress -eq "")
    {
        throw "[-SvnAddress] can not be empty.";
    }

    if($GitAddress -eq $null -or $GitAddress -eq "")
    {
        throw "[-GitAddress] can not be empty.";
    }

    # 克隆svn项目
    git svn clone $SvnAddress --no-metadata --no-minimize-url  --no-minimize-url;

    # 添加远程git地址
    git remote add origin $GitAddress;

    # 提交到git
    git push -u origin master -f;
}


# 回到脚本目录
pushd $pspath;

```

### 使用说明

**保存这个脚本为：`svntogit.ps1`**&#x20;

然后打开 `PowerShell` 运行这个脚本

```
& "./svntogit.ps1"
```

**如果你是首次运行，需要提供 `Svn` 和 `Git` 地址**

**如果已经同步过了，只需要提供 Git 本地目录地址即可，其他的为空。**

## 自己手动操作（不推荐）

### 首次将Svn转Git

```
git svn clone 远程SVN地址 --no-metadata --no-minimize-url  --no-minimize-url  项目名称
git remote add origin http://dev.alliantplans.com:3000/hoa/MemberPortal.git
git push -u origin master -f
```

**特别注意，只有首次才会执行上述命令！！！！！！**

### **后续继续同步SVN到Git**

```bash
# 如果 local-git-svn 分支存在才执行这条命令
git branch -d local-git-svn

# 创建分支并切换到 local-git-svn
git checkout -b local-git-svn  refs/remotes/git-svn

# 拉取SVN最新修改代码
git svn fetch

# 切换回主分支
git checkout master

# 再删除分支 local-git-svn
git branch -d local-git-svn

# 再重写创建分支并切换到 local-git-svn
git checkout -b local-git-svn  refs/remotes/git-svn

# 切换回主分支
git checkout master

# 合并最新代码到 master 分支
git merge local-git-svn

# 推送到远程
git push -u origin master
```

## 常见错误

这是 Git 2.27.0 版本才有的，解决只需要下载 前一个版本即可：<https://github.com/git-for-windows/git/releases/download/v2.26.0.windows.1/Git-2.26.0-64-bit.exe>

```bash
svn: E235000: In file 'subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_p
l.c' line 1666: assertion failed (get_current_pool_cb != NULL)
      0 [main] perl 1921 cygwin_exception::open_stackdumpfile: Dumping stack tra
ce to perl.exe.stackdump
```
