SVN代码迁移至GITLAB记录(保留日志分支标签)
一、操作
1.用户映射文件生成
在本地新建一个项目名称ABC的文件夹,此路径下打开git bush,输入以下命令,可以生成一个userInfo.txt文件
svn log https://你的svn项目地址 -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2"="$2" <"$2"@email.com>"}' | sort -u > ./userInfo.txt
其中【@email.com】可根据公司邮件地址修改该后缀。 userInfo.txt中文件内容示例如下:
注意点: 如果迁移单个指定项目,svn版本库地址要精确到项目trunk或者某个分支。 如果迁移整个项目(包含trunk,分支,tag),注意路径不能写到trunk,否则会导致某个分支提交过代码的用户映射信息没导出,git svn clone时会执行到一半报错(这样就白跑了半天了……)
2. git svn clone
输入以下命令,克隆代码到打开git bash的路径下
git svn clone --stdlayout --no-metadata -A userInfo.txt https://你的svn项目地址
如有弹窗,则弹窗先输入p,后续根据相关提示输入用户名和密码即可。
命令相关参数释义: –stdlayout:可缩写为-s ,代表–trunk=trunkname --branches=branches --tags=tags。主干/分支/标签这种结构的可以使用该选项,如果需要拉取指定项目内容,则将其替换指定项目即可。 –no-metadata:不拉取SVN metadata附加信息 -A userInfo.txt:–authors-file=filename 的简写,根据提供的文件,将提交的作者名称映射到对应的用户邮箱地址。 注意:使用-A 时,如果出现了不在映射文件中的用户,则此次克隆会被终止,请检查用户映射文件并重新执行命令。
如果没有发生其他故障或问题,请慢慢等待跑完,提交次数会决定跑多久才能跑完…… 如果发生故障,请参考第二节遇到问题,未能解决的话,可以百度看看。
3. 标签和分支处理
代码已经克隆完了,这会查看下分支,发现svn上的所有标签和分支都位于远端,这样子上传代码,传上去的根本没有任何分支和标签。 需要处理一下标签和分支。 按以下代码处理之后,上传代码就可以将所有分支和标签信息都上传上去了。
#查看分支
git branch -a
#创建本地标签/分支并删除远端标签/分支
git for-each-ref refs/remotes/origin/tags |cut -d / -f 5-|grep -v @| while read tagname; do git tag "$tagname" "origin/tags/$tagname"; done
git for-each-ref refs/remotes/origin/tags |cut -d / -f 5-|grep -v @| while read tagname; do git branch -r -d "origin/tags/$tagname"; done
此时上传的分支和标签信息,可能会有一些已经被删除的无用分支/标签(例如改过名字的A1和B1),我的项目就俩无用分支和标签,上传到git之后我手动在gitlab删除的,未探索自动处理方法。
4. 上传代码到git
gitlab新建一个项目,复制项目链接,然后再git bash里执行如下命令,添加远端的地址:
#删除远端关联地址命令
git remote rm origin
#关联
git remote add origin https://你的git项目地址.git
添加完成后,执行两次push,就能把所有branches和tags上传到远端了。
git push origin --all
git push origin --tags
将提交过代码的项目组成员全部添加到项目中。
5. 提交测试
提交.gitignore.txt文件测试一下,是否正常使用功能。 记得给需要的分支都补充.gitignore.txt文件。
6. jenkins修改
修改jenkins路径从svn到git,测试一下是否能够正常打包。
二、遇到问题
1. git svn clone命令执行失败 报错信息1:
E0701+Administrator@E0701 MINGW64 /e/ABC
$ git svn clone --stdlayout --no-metadata -A userInfo.txt https://你的svn项目地址/trunk
Can't load '/usr/lib/perl5/vendor_perl/auto/SVN/_Core/_Core.dll' for module SVN::_Core: No such file or directory at /usr/lib/perl5/core_perl/DynaLoader.pm line 193.
at /usr/lib/perl5/vendor_perl/SVN/Base.pm line 59.
BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/SVN/Core.pm line 5.
Compilation failed in require at F:/Git/mingw64/share/perl5/Git/SVN/Utils.pm line 6.
BEGIN failed--compilation aborted at F:/Git/mingw64/share/perl5/Git/SVN/Utils.pm line 6.
Compilation failed in require at F:/Git/mingw64/share/perl5/Git/SVN.pm line 32.
BEGIN failed--compilation aborted at F:/Git/mingw64/share/perl5/Git/SVN.pm line 32.
Compilation failed in require at F:/
………………
#省略了部分错误信息
解决方法: 升级git版本,win10操作如下: 管理员身份打开cmd,输入以下命令:
git update-git-for-windows
更新进度跑到100%之后,会自动弹窗安装,安装完成之后重新打开git bash,进行git svn clone即可正常使用。
报错信息2:
#
Initialized empty Git repository in E:/ABC/.git/
Using higher level of URL: https://svn项目地址/ABC/trunk => https://svn项目地址/ABC
解决方法: git svn会默认拉取root路径的整个svn项目,如果你需要拉取整个项目,则修改git svn clone中的svn项目地址为=>后边的地址,重新执行命令。 如果只需要拉取指定项目,则在git svn clone这一串命令后边加上【 --no-minimize-url】,这样克隆时只会拉取你要求的项目,不会自动拉取上级内容。
2. git svn clone克隆过程中缺少用户映射 报错信息:
E7+Administrator@E7 MINGW64 /e/ABC
$ git svn clone --stdlayout --no-metadata -A userInfo.txt https://SVN项目地址/ABC
Initialized empty Git repository in E:/ABC/ABC/.git/
r1 = 0c6aee289ca677845e4ddef247039f02dd61703b (refs/remotes/origin/trunk)
A test.txt
Author: zhangs not defined in userInfo.txt file
解决方法: 产生原因是生成映射的时候,使用了trunk的路径,所以缺少了分支中的用户,修改路径重新生成一遍用户映射文件即可。
3. jenkins打包失败 报错信息:
Created release folders
ISDEV : error -6102: Error searching for dynamic files matching "E:\jenkins\ABC\otp-install\build\jasper\*.*"
InstallShield Script Compiler
Version 21.0.0.338
…………
Releases\SINGLE_EXE_IMAGE - 1 error(s), 0 warning(s)
Log file has been created: <file:E:\jenkins\ABC\releases\Releases\SINGLE_EXE_IMAGE\LogFiles\10-25-2022 03-02-55 ??.txt>
Build finished at ?? 25 2022 03:03 ??
:makeInstall FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':makeInstall'.
> Process 'command 'cmd'' finished with non-zero exit value 1
>
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 2 mins 47.724 secs
Build step 'Invoke Gradle script' changed build result to FAILURE
Build step 'Invoke Gradle script' marked build as failure
Finished: FAILURE
产生原因: svn允许上传空文件夹,git不允许,所以一些历史残留的没用文件夹,没有上传,但打包程序里头还有那个文件夹的信息,导致打包失败,修改一下打包用的程序就可以正常使用了。 我司是古早的.ism文件,检查一下files and folders 里头的文件夹在git代码上都有没有,没有的话把ism里头的文件夹删了,重新上传一下ism文件。
三、参考
- 指定某项目迁移
- 整个项目迁移
- git svn官方手册
- git svn clone命令执行失败问题解决参考链接
|