[如何同步迁移之后继续在SVN提交的代码到Git](https://blog.csdn.net/ouyang_peng/article/details/76220621)
[Converting a Subversion repository to Git](http://john.albin.net/git/convert-subversion-to-git)
[SVN仓库迁移到Git的完美解决办法](https://www.cnblogs.com/shawnpoo/p/SVN-cang-ku-qian-yi-daoGit-de-wan-mei-jie-jue-ban-.html)
[Git 与 Subversion](https://git-scm.com/book/zh/v1/Git-%E4%B8%8E%E5%85%B6%E4%BB%96%E7%B3%BB%E7%BB%9F-Git-%E4%B8%8E-Subversion)
一、创建git 仓库
git服务器192.168.117.166
$cd /home/git/git_repository
$git init --bare myproject1
$chown -R git:git myproject1
二、svn 迁移 git
#1.
$git svn clone svn://192.168.117.166/myproject1 --no-metadata
#2. 添加远程git仓库
$git remote add origin git@192.168.117.166:git_repository/myproject1
#3. 本地代码提交到远程git仓库
$git push -u origin master
#4.测试
$ git show-ref # remotes/git-svn 此分支为svn 仓库分支,可以同步svn的提交代码
8e17273a9fb36cea33858674c7343e7d839f82c1 refs/heads/master
6a0387676a5917b94702699de651fdd2b6595e2c refs/remotes/git-svn
$
三、迁移git之后,同步 在 SVN 提交的新代码 到 Git 仓库
#1.删除分支 local-git-svn
$git branch -d local-git-svn
#2.创建分支
$git checkout -b local-git-svn remotes/git-svn
#3.
$git svn fetch
#4.切换分支
$git checkout master
#5。合并
$git merge local-git-svn
#6.本地代码提交到远程git仓库
$git push -u origin master
详细说明
#git show-ref List references in a local repository
$ git show-ref
8e17273a9fb36cea33858674c7343e7d839f82c1 refs/heads/master
6a0387676a5917b94702699de651fdd2b6595e2c refs/remotes/git-svn
$
通过上面的操作,我们可以看到有个远程分支remotes/git-svn,
remotes/git-svn 此分支为svn 仓库分支,可以同步svn的提交代码
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
ignorecase = true
[svn-remote "svn"]
url = svn://192.168.117.166/myproject1
fetch = :refs/remotes/git-svn
$
--no-metadata
通过 git svn clone 命令可以把整个 SVN 仓库导入到一个本地的 git 仓库中, 但这样导入的代码提交历史很糟糕, 需要做一些处理.
在 clone 后面添加 –no-metadata 来阻 git svn 包含那些 SVN 的附加信息(git-svn-id,url等)。
同时为了获得更精确的提交者 ID 和邮箱, 添加 –authors-file 参数
2.0
git服务器192.168.117.166
$cd /home/git/git_repository
$git init --bare myproject1
$chown -R git:git myproject1
2.1
git svn clone 命令可以把整个 SVN 仓库导入到一个本地的 git 仓库中
$git svn clone svn://192.168.117.166/myproject1 --no-metadata
2.2 添加远程git仓库
git remote add origin git@192.168.117.166:git_repository/myproject1
2.3 本地代码提交到远程git仓库
git push -u origin master
2.4 测试
git clone git@192.168.117.166:account_nometadata
$ git log
commit f54e5926bccbb1ebe2db0b6732d9f9fa636da2b4 (HEAD -> master, git-svn)
Author: fanshuang <fanshuang@98e6f2a6-287a-4b68-ab66-a349012035ff>
Date: Fri Sep 28 07:04:14 2018 +0000
modify 新建文件文档.txt
commit a50408a65c985e473d6929cf312733058bdef0b3
Author: fanshuang <fanshuang@98e6f2a6-287a-4b68-ab66-a349012035ff>
Date: Fri Sep 28 06:29:35 2018 +0000
三
2、创建用户映射
在 Subversion,每个提交者在都在主机上有一个用户名,记录在提交信息中. 比如 blame 的输出以及 git svn log。如果想让这条信息更好的映射到 Git 作者数据里,则需要从 SVN 用户名到 Git 作者的一个映射关系建立一个叫做 user.txt 的文件,用如下格式表示映射关系:
zhangsan = zhangsan <zhangsan@gmail.com>
lisi = lisi <lisi@gmail.com>
wangwu = wangwu <wangwu@gmail.com>123
在svn库下执行该命令可以在当前文件夹生成users.txt,获得 SVN 作者的列表:
svn log ^/ --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt1
根据svn帐号与git帐号的映射,补充users.txt为上述格式。
【解决的问题】: 迁移git后,svn、git同步更新
第一步
第二步 建立本地分支 local-git-svn 对应远程分支git-svn
$ git show-ref
6be4f1538d99225f739390e8aa5f388b9ed7e227 refs/heads/local-git-svn
0199eaa4c61ab0bc170004ffb518ef082a5ae318 refs/heads/master
27a116634872a922671f14e06d2c7a2ad3d40106 refs/remotes/git-svn
0199eaa4c61ab0bc170004ffb518ef082a5ae318 refs/remotes/origin/master
#关联远程分支 remotes/git-svn
$ git checkout -b local-git-svn remotes/git-svn
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
ignorecase = true
[svn-remote "svn"]
noMetadata = 1
url = svn://192.168.117.166/myproject1
fetch = :refs/remotes/git-svn
[remote "origin"]
url = git@192.168.117.166:git_repository/myproject1
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
$
第三步 在local-git-svn 分支
使用 git svn fetch 命令同步SVN最新的提交记录,然后可以通过 git log命令查看git的提交记录对应的svn记录相同。
$ git branch #当前分支在 local-git-svn
* local-git-svn
master
$git svn fetch
$git log
第4步,切换分支到master分支,然后merge刚才的local-git-svn分支
#切换分支到master分支,
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git branch
local-git-svn
* master
#然后merge刚才的local-git-svn分支
$ git merge local-git-svn
Merge made by the 'recursive' strategy.
20180607.txt | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
$
第五步 提交master分支到远程仓库
git push -u origin master同步迁移之后继续在SVN提交的代码到Git
#1.删除分支 local-git-svn
$git branch -d local-git-svn
#2.创建分支
$git checkout -b local-git-svn remotes/git-svn
#3.
$git svn fetch
#4.
$git checkout master
#5。
$git merge local-git-svn
#6.
$git push -u origin master




