SVN仓库转Git仓库(针对大仓库)

本文介绍了一种高效的SVN仓库转换成Git仓库的方法。通过使用svn2git工具及Docker环境,即使面对大型SVN仓库也能快速完成转换。文中详细介绍了搭建环境、配置规则文件及转换步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于把SVN仓库转为Git仓库的方式有不少,最常见的比如有git自带的git svn clone命令,或者SubGit,还有许多其它的。

在使用过程中,发现无论是git svn还是SubGit,效率都不高,针对小型仓库没什么问题,但对于上万commit的仓库就比较吃力了。

研究了一通之后,发现了这么一个项目svn2git。非常好的项目,感觉作者。

鉴于项目搭建有些小麻烦,笔者把环境都打包进了一个docker镜像。

下面分享下使用方式。

再次强调,此方式依赖于docker环境。

环境已经在docker中准备好。拉取docker

docker pull cevin15/svn_2_git:2.0

启动docker

docker run -i -d -v <主机目录,存放git项目>:/home/data/git -v <主机目录,存放svn项目>:/home/data/svn  --name svn2git cevin15/svn_2_git:2.0

进入docker

docker exec -it svn2git /bin/bash

制定svn2git的规则文件

创建一个rules文件。 内容例子:oschina.rules

create repository oschina.git
end repository

match /
  repository oschina.git
  branch master
end match

更多规则文件的语法,可以查看 https://github.com/svn-all-fast-export/svn2git/tree/master/samples

开始转项目

## 1.  svn仓库转git裸仓库
$ /tmp/svn2git/svn-all-fast-export --rules {rules文件路径}  {svn服务端仓库路径}

## 2. git裸仓库导出为git项目
$ git clone file://{git裸仓库路径} {git项目路径}

以上就是使用svn2git进行SVN项目转Git项目的操作。经过笔者这边的实际测试:一个50,000多commit,5G多大小的SVN仓库,完整转为Git仓库用时1个小时左右;一个70,000多commit,60G多大小的SVN仓库,完整转为Git仓库用时3个多小时。总的来说,效率还是可以的。

最后,感谢此项目svn2git,以及项目的贡献者。

希望对你有所帮助,enjoy it :-)

转载于:https://my.oschina.net/cevin15/blog/1540664

<think>我们正在处理用户的问题:如何将SVN仓库Git仓库同步。根据提供的引用,我们可以总结出几种方法: 1. 使用 `git-svn` 工具进行双向同步(引用[2]和引用[4]) 2. 将SVN仓库迁移Git仓库(引用[1]和引用[3]) 用户的问题是关于同步,而不是一次性迁移,所以我们重点考虑第一种方法。引用[2]详细描述了使用`git-svn`的工作流程。 ### 步骤说明 #### 1. 初始克隆 首先,我们需要将SVN仓库克隆到本地Git仓库。使用以下命令: ```bash git svn clone [SVN远程URL] [本地目录名] ``` 这个命令会将整个SVN仓库(包括历史记录)换为一个本地的Git仓库。 #### 2. 日常开发流程 - 在本地使用Git进行开发:可以创建分支、提交等。 - 当需要提交到SVN服务器时: a. 确保当前在`master`分支(或你跟踪SVN的分支)上。 b. 运行`git svn rebase`:从SVN服务器获取最新更改并应用到当前分支(相当于`svn update`)。 c. 解决可能的冲突。 d. 运行`git svn dcommit`:将本地的Git提交推送到SVN服务器(相当于`svn commit`)。 #### 3. 同步到另一个远程Git仓库 如果用户还希望将本地的Git仓库同步到一个远程Git仓库(例如GitHub、GitLab等),可以添加一个远程仓库并推送。 例如: ```bash git remote add origin [Git远程URL] git push -u origin master ``` 然后,在开发过程中,可以将本地的分支推送到这个远程Git仓库: ```bash git push origin [分支名] ``` ### 注意事项 - 在`dcommit`之前,务必先`rebase`,以避免覆盖他人的工作(引用[2])。 - 如果本地有多个分支,在推送到SVN时,需要将修改合并到跟踪SVN的分支(通常是`master`)上。 ### 引用说明 根据引用[4],用户可以在使用`git-svn`与SVN服务器交互的同时,将私有分支推送到远程Git仓库,以便在其他地方工作。 ### 完整示例 假设我们有一个SVN仓库:`https://svn.example.com/project/trunk` 我们希望将其同步到本地Git仓库,并且同时推送到一个远程Git仓库(如:`git@github.com:user/project.git`)。 步骤: 1. 克隆SVN仓库: ```bash git svn clone https://svn.example.com/project/trunk project cd project ``` 2. 添加远程Git仓库: ```bash git remote add origin git@github.com:user/project.git ``` 3. 将本地`master`分支推送到远程Git仓库: ```bash git push -u origin master ``` 4. 日常开发: - 在本地创建特性分支: ```bash git checkout -b feature-branch ``` - 进行开发并提交到本地Git。 5. 当需要将特性分支合并到主分支并提交到SVN: - 切换回`master`分支: ```bash git checkout master ``` - 从SVN更新: ```bash git svn rebase ``` - 合并特性分支: ```bash git merge feature-branch ``` - 提交到SVN: ```bash git svn dcommit ``` 6. 将特性分支推送到远程Git仓库(可选,用于备份或协作): ```bash git push origin feature-branch ``` ### 注意事项 - 使用`git svn`时,建议保持线性历史,避免复杂的合并,因为SVN不支持非线性历史。 - `git svn dcommit`会将本地所有未推送到SVN的提交(在`git svn rebase`之后)一次全部推送到SVN,每个Git提交都会换为一个SVN提交。 ### 相关问题 根据用户的问题,我们生成以下相关问题: §§相关问题§§ 1. 如何解决使用`git svn rebase`时出现的冲突? 2. 除了`git-svn`,还有哪些工具可以实现SVNGit的双向同步? 3. 如何将SVN的分支和标签迁移Git仓库? 4. 在使用`git-svn`时,如何管理多个分支的开发? 5. 如何设置忽略文件(如`.gitignore`)以匹配SVN的忽略设置? 请用户根据实际需求选择相关问题。</think>### 如何将 SVN 仓库Git 仓库同步 #### 核心方法:使用 `git-svn` 工具 `git-svn` 是官方提供的 SVN-Git 双向同步工具,允许在本地使用 Git 管理代码,同时与远程 SVN 服务器交互。 ##### 操作步骤: 1. **初始化克隆**(首次同步) 将 SVN 仓库完整克隆到本地 Git 仓库: ```bash git svn clone [SVN远程URL] --stdlayout # --stdlayout 表示标准目录结构(trunk/branches/tags) ``` 示例: ```bash git svn clone https://svn.example.com/project/ --username=your_svn_user ``` 2. **日常开发流程** - 在本地使用 Git 分支开发: ```bash git checkout -b feature-new # 创建 Git 分支 # 进行代码修改... git commit -m "新功能开发" ``` - **同步前必做**:从 SVN 获取更新(避免覆盖冲突): ```bash git svn rebase # 相当于 svn update ``` 3. **提交到 SVN 服务器** 将本地 Git 提交推送到 SVN: ```bash git svn dcommit # 将 Git 提交换为 SVN 提交 ``` 4. **同步到远程 Git 仓库**(可选) 若需将代码备份到 GitHub/GitLab: ```bash git remote add origin [Git远程URL] git push -u origin master # 推送主分支 ``` #### 关键注意事项 1. **强制同步场景** 当 Git 仓库SVN 出现冲突时(如历史记录不一致),可强制推送: ```bash git svn dcommit --force # 谨慎使用[^1] ``` 2. **分支管理限制** - SVN 分支需通过特定命令操作: ```bash git svn branch new-feature # 在 SVN 创建分支 git svn fetch # 获取远程分支 ``` - Git 本地分支无法直接映射到 SVN(需合并到 `master` 再 `dcommit`)[^2] 3. **忽略规则同步** 手动同步 `.gitignore` 与 SVN 的忽略列表: ```bash git svn show-ignore > .gitignore # 生成忽略文件 ``` #### 工作流示意图 ```mermaid graph LR SVN服务器 --git svn clone--> 本地Git仓库 本地Git仓库 --git svn rebase--> SVN服务器[更新代码] 本地Git仓库 --git svn dcommit--> SVN服务器[提交代码] 本地Git仓库 --git push--> 远程Git仓库[备份/协作] ``` #### 典型问题解决 - **提交冲突**:先执行 `git svn rebase` 解决冲突,再 `dcommit` - **历史记录丢失**:用 `git svn fetch` 重建关联 - **仓库迁移**:推荐先用 `svnadmin dump` 导出,再通过 `git-svn` 换[^3] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值