暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

svn迁移Git的解决方案

科学杂谈 2018-09-28
474


[如何同步迁移之后继续在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






文章转载自科学杂谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论