公司要从 SVN 迁移到 Git,但不能一刀切,两边得并行一段时间。调研了一圈,git-svn 只能单向且历史处理很粗糙,svn2git 是一次性迁移不支持持续同步。最后选了 SubGit,虽然是商业软件,但双向实时同步这点没得挑。
以下是完整配置过程,踩过的坑都标出来了。
先把目录建好:
mkdir -p /home/golovin/svn-to-git-projects/git-repo # Git 裸仓库
mkdir -p /home/golovin/svn-to-git-projects/workspace # 工作目录git-repo 放 SubGit 管理的裸仓库,workspace 是实际写代码的地方。
git init --bare /home/golovin/svn-to-git-projects/git-repo/your-project.git必须用裸仓库,不然同步会出问题。
subgit configure https://your-svn-server/svn/repo \
/home/golovin/svn-to-git-projects/git-repo/your-project.git执行完会在 your-project.git/subgit/ 下生成一堆配置文件。
SVN 只有用户名,Git 要 Name <email> 格式:
cat > /home/golovin/svn-to-git-projects/git-repo/your-project.git/subgit/authors.txt << 'EOF'
golovin = Golovin <golovin@company.com>
zhangsan = Zhang San <zhangsan@company.com>
EOF这步别偷懒,漏了人同步会直接报错。
vim /home/golovin/svn-to-git-projects/git-repo/your-project.git/subgit/passwd把 SVN 密码写到最后一行。明文存储,记得 chmod 600。
这步坑最多。编辑配置:
vim /home/golovin/svn-to-git-projects/git-repo/your-project.git/subgit/config找到大约 130 行左右:
trunk = trunk:refs/heads/master
branches = branches/*:refs/heads/*
tags = tags/*:refs/tags/*
shelves = shelves/*:refs/shelves/*如果你的 SVN 是标准布局(trunk/branches/tags),保持默认。
如果你只有某个分支的权限(比如我只能访问 https://xxx/trunk),改成:
trunk = :refs/heads/master
# branches = branches/*:refs/heads/*
# tags = tags/*:refs/tags/*
# shelves = shelves/*:refs/shelves/*冒号前面空着,表示 URL 根路径就是 trunk。
subgit install /home/golovin/svn-to-git-projects/git-repo/your-project.git首次会拉取全部历史,大仓库可能要跑几个小时。跑完看一眼日志确认没报错就行。
配置完就能正常用了:
git clone /home/golovin/svn-to-git-projects/git-repo/your-project.git \
/home/golovin/svn-to-git-projects/workspace/your-project之后正常 git pull、git push,SubGit 会自动同步到 SVN。
默认试用 7 天,发邮件申请能拿到 30 天的 key。
激活:
# 把 key 放到统一位置
mkdir -p /home/golovin/.subgit
cp /mnt/c/Users/golovin/Downloads/subgit.key /home/golovin/.subgit/
# 注册(要 sudo,会写 /etc/subgit/)
sudo /home/golovin/software/subgit-3.3.18/bin/subgit register \
--key /home/golovin/.subgit/subgit.key \
/home/golovin/svn-to-git-projects/git-repo/your-project.git到期了换个邮箱申请新 key,覆盖注册就行:
sudo subgit register \
--key /path/to/new-subgit.key \
/home/golovin/svn-to-git-projects/git-repo/your-project.git# 手动拉取 SVN 更新
subgit fetch <repo.git>
# 检查同步状态
subgit verify <repo.git>
# 暂停同步(配置保留,之后可以重新 install)
subgit uninstall <repo.git>
# 彻底删除(清掉所有 SubGit 数据)
subgit uninstall --purge <repo.git>
# 停止后台进程
subgit shutdown <repo.git>Author not found:作者映射没配全,补上就好logs/ 确认在跑就行sudo,写不了 /etc/subgit/整个流程跑通大概半小时(不算首次同步时间)。SubGit 确实省心,配好之后基本不用管。
加载评论中...