如何将SVN的增量提交同步至Gerrit并保留提交历史
同步SVN增量提交到Gerrit并保留提交历史
替代svn diff获取变更的方法
如果需要获取r844之后的所有变更(含每个提交的独立记录),除了生成整体补丁,还有两种更实用的方式:
- 查看所有提交明细:
svn log -r r844:HEAD --verbose,能看到每个提交的作者、时间、变更文件列表和提交信息 - 生成单提交补丁:
svn diff -r rN:rN+1 > patch-N.diff(N从844开始,逐个生成每个提交的补丁)
不过最适合同步到Git/Gerrit的方式是用git-svn工具,直接将SVN提交转换为Git独立提交,无需手动处理补丁。
完整同步流程(保留每个提交历史)
1. 准备本地Gerrit仓库
确保你已经克隆了Gerrit目标仓库到本地:
git clone <Gerrit仓库URL> local-gerrit-repo cd local-gerrit-repo
2. 配置git-svn连接SVN仓库
初始化SVN远程关联,指定SVN仓库地址:
git svn init <SVN仓库完整URL> --prefix=svn/
如果之前同步到SVN的r844,直接拉取该版本之后的所有提交:
git svn fetch -r r844:HEAD
这一步会将SVN从r844到最新的4个提交,逐个转换为Git提交,存储在svn/trunk(若为标准SVN trunk布局)分支中,每个提交会保留原SVN的作者信息、提交时间和提交日志。
提示:如果需要将SVN用户名映射为Git作者信息,可创建
authors.txt文件,格式为svn_username = Git Full Name <email@example.com>,然后执行git config svn.authorsfile ./authors.txt再执行fetch。
3. 将SVN提交同步到Gerrit分支
查看svn/trunk中的提交记录,确认那4个转换后的Git提交:
git log svn/trunk --oneline
然后将这些提交逐个cherry-pick到你的Gerrit本地工作分支(比如master):
git checkout master git cherry-pick <第一个SVN转换提交的哈希> git cherry-pick <第二个SVN转换提交的哈希> git cherry-pick <第三个SVN转换提交的哈希> git cherry-pick <第四个SVN转换提交的哈希>
如果遇到冲突,解决冲突后执行git cherry-pick --continue即可。
4. 推送到Gerrit
完成所有cherry-pick后,将这些保留历史的提交推送到Gerrit进行审核:
git push origin HEAD:refs/for/master
(替换master为你的目标分支)
这样每个SVN提交都会对应一个独立的Gerrit提交,完整保留原提交的历史信息。
内容的提问来源于stack exchange,提问作者rahul raj
相关产品推荐
相关产品推荐

