如何用 git-svn 把 Subversion 仓库转换为 Git 并推送到 GitHub
【免费下载链接】docsThe open-source repo for docs.github.com项目地址: https://gitcode.com/GitHub_Trending/do/docs
如果你手上有一个 Subversion(SVN)仓库,想把它连同提交历史一起迁移到 GitHub,官方文档给出的命令行路径是:先用git-svn把 SVN 仓库转换成 Git 仓库,再把生成的 Git 仓库推送到 GitHub。这条路径要求你在 macOS 或 Linux 系统上操作,并且本机上已安装 Subversion、Git(包含git-svn组件)以及 Git Large File Storage(Git LFS)。完整步骤以文档 Importing a Subversion repository 为准。
准备工作:确认三个工具都已可用
在开始转换之前,逐一确认环境满足要求:
git --version输出应类似git version 2.40.0。
git svn --version输出应类似git-svn version 2.40.0 (svn 1.14.2)。如果你能正常执行git但执行git svn报错,说明git-svn没有随 Git 一起装上,需要单独安装;文档建议使用自带git-svn包的 Homebrew 或 Ubuntu 包管理器。
git lfs --version输出应类似git-lfs/3.1.4 (GitHub; darwin arm64; go 1.18.1)。如果仓库中有大文件,这一步不能跳过。
在 GitHub 上创建空仓库
先在你的 GitHub 上创建一个新仓库作为迁移目标。为避免推送时出错,不要用 README、license 或 .gitignore 文件初始化这个新仓库,这些文件可以在项目推送完成后再补充。
导出 Subversion 仓库的作者列表
git-svn转换时需要一份作者映射文件,把 SVN 仓库里的作者名对应到 Git 仓库中想使用的名字。分两步完成:
进入你的 Subversion 仓库目录,运行下面的脚本生成
authors.txt:svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2" = "$2 }' | sed -E 's/^ *//' | sort | uniq > authors.txt编辑
authors.txt,把每行改成SVN作者名 = 想要的Git作者名 <邮箱>的格式。例如:octocat = The Octocat <octocat@github.com>这个文件决定了转换后每条提交显示的作者,如果跳过这一步,Git 仓库里的作者信息将没有对应的邮箱。
用 git svn clone 转换仓库
如果你的 Subversion 仓库是标准布局(包含trunk、branches、tags目录),使用-s参数克隆:
git svn clone -s URL PATH/TO/DESTINATION --authors-file PATH/TO/AUTHORS.TXT各参数含义:
URL:Subversion 仓库的地址;PATH/TO/DESTINATION:要把仓库克隆到的本地目录;PATH/TO/AUTHORS.TXT:上一步生成并编辑好的authors.txt的路径。
文档中的示例是把 Sourceforge 上的 Logisim 项目克隆到本地logisim目录:
git svn clone -s https://svn.code.sf.net/p/circuit/code logisim --authors-file path/to/authors.txt如果你的 Subversion 仓库不是trunk/branches/tags的标准布局,git svn也支持自定义处理方式,参见 Git 官方文档中的 git-svn 说明。
转换过程中 Git 会逐个检查 SVN 版本并把它变成 Git 提交,仓库文件多或历史长时这个过程会持续很久。文档特别提示:大型仓库上命令可能看似卡住,此时可以用Ctrl+C终止命令,进入新建的目录后执行git svn fetch,即可从中断处继续拉取。
把转换结果推送到 GitHub
进入
git svn clone生成的 Git 仓库目录。添加 GitHub 仓库作为远程:
git remote add origin URL其中
URL替换为你在准备阶段创建的那个 GitHub 仓库的地址,例如https://github.com/octocat/example-repository.git。推送整个仓库:
git push --mirror origin推送完成后到 GitHub 仓库页面核对:提交历史、分支应都已同步。
推送失败时检查大文件
如果仓库中包含超过 GitHub 文件大小限制的文件,git push --mirror可能会失败。此时把大文件迁移到 Git LFS 后重试:
git lfs import执行后重新运行git push --mirror origin。
相关文档
- 导入源码总览:Importing source code
- 命令行导入方式的其他来源:Using the command line to import source code
- 2 GB 推送限制排查(仅 GitHub.com / GitHub Enterprise Cloud 适用):Troubleshooting the 2 GB push limit
【免费下载链接】docsThe open-source repo for docs.github.com项目地址: https://gitcode.com/GitHub_Trending/do/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考