迁移 SVN 到 Git
最近需要考虑将某些项目从 SVN 迁移到 Git. Atlassian有篇非常优秀的文章介绍如何从SVN迁移到Git; 如果你准备迁移到Gitlab, 那么Gitlab官方也有一篇文章介绍如何操作.
从SVN迁移代码库到Git, 一般有三个选择:
- 一次性将整个项目代码库迁移到Git 并且 停用SVN
- 存在的项目继续使用 SVN, 新项目使用Git
- 同一个项目既使用SVN又使用Git
实际情况往往是复杂的, 而且迁移到Git之后协同工作流应该做适当调整. 对于中小型项目, 可以选择一次性将整个代码库迁移到Git, 这种做法相对容易,当然操作前需要所有开发人员花时间熟悉和学习Git工作流.
获取 svn authors
svn log --quiet --username USERNAME [SVN_REPO_URL] | grep -E "r[0-9]+ \|.+ \|" | cut -d'|' -f2 | sed 's/ //g'|sort -u | tee authors.txt
转换为 git authors 格式
awk 'NF{print $0 " = " $0" <"$0"@DOMAIN.com>"}' authors.txt | tee authors.git.txt
migration
方法一: git-svn
使用git-svn clone
git svn clone -T TRUNK -t TAGS -b BRANCHES --authors-file=authors.git.txt --username USERNAME svn://your.server.tld/repo git_repo_name
删除 svn peg-revisions
for p in $(git branch | grep @); do git branch -D $p; done
for p in $(git tag -l | grep @); do git tag -d $p; done
添加 remote origin
添加 remote origin之前, 我们先做一些本地配置
git config user.name "YOUR_USERNAME"
git config user.email "YOUR_EMAIL"
git config http.sslVerify false #Option
现在添加 remote
git remote add origin git@your.server.tld:username/projectname.git
git push -u origin master
git push --all
git push --tags
方法二: subgit
使用subgit工具
配置
subgit configure [SVN_REPO_URL] REPO.sugbit
执行后你会看到
SubGit version 3.3.10 ('Bobique') build #4368
Configuring writable Git mirror of remote Subversion repository:
Subversion repository URL : svn://your.server.tld/repo
Git repository location : REPO.subgit
CONFIGURATION SUCCESSFUL
To complete SubGit installation do the following:
1) Adjust Subversion to Git branches mapping if necessary:
/data/REPO.subgit/subgit/config
2) Define at least one Subversion credentials in default SubGit passwd file at:
/data/REPO.subgit/subgit/passwd
OR configure SSH or SSL credentials in the [auth] section of:
/data/REPO.subgit/subgit/config
3) Optionally, add custom authors mapping to the authors.txt file(s) at:
/data/REPO.subgit/subgit/authors.txt
4) Run SubGit 'install' command:
subgit install REPO.subgit
按照要求配置好
- branch mapping
- username/password
- authors mapping
安装
subgit install REPO.subgit
你将看到
SubGit version 3.3.10 ('Bobique') build #4368
Translating Subversion revisions to Git commits...
Subversion revisions translated: 1218.
Total time: 534 seconds.
INSTALLATION SUCCESSFUL
You are using SubGit in evaluation mode.
Your evaluation period expires on XXX (in 7 days).
Extend your trial or purchase a license key at https://subgit.com/pricing
subgit register --key subgit.key REPO.subgit
Clone
git clone REPO.subgit REPO.subgit.git
上传
cd REPO.subgit.git
git remote set-url origin git@your.server.tld:username/projectname.git
#master
git push origin master
#分支
for branch in `git branch -r | grep -Ev "HEAD|master" | cut -d/ -f2`; do git push origin remotes/origin/$branch\:refs/heads/$branch; done # 冒号后面为远程仓库中的地址,必须以refs/heads开头
#tags
git push --tags
转换之后还需要处理 .gitignore
其他需要谨记的:
- 保持history 线性
- 尽量使用rebase 而不是 merge
本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可。转载请注明来源: https://snowfrs.com/2020/08/27/migration-svn-to-git.html 欢迎对文中引用进行考证,欢迎指出任何不准确和模糊之处。