
# 迁移SVN代码仓
#### 约束限制
- 该功能需要保证被导入的仓库域名和服务节点网络连通。
- 用户需要新建项目或者已有项目。
- 用户需要有新建仓库的权限，如果用户没有权限，可以参考[配置代码仓库级的权限](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0066.html)。
 
 #### 在线导入SVN平台的代码仓库到CodeArts Repo
1. 进入CodeArts Repo首页后，单击"新建仓库"，在"归属项目"下拉框中选择已有的项目或者"新建项目"。
2. 仓库类型选择"导入仓库"，导入方式选择"SVN"，参数填写请参考[表1]。
   
    表1导入SVN平台代码仓库的参数表格 
   | 字段名称    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   |:---|:---|
   | 源仓库路径   | 该参数必填，该参数表示要导入的仓库路径。源仓库路径需要以（http://）开头。                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 源仓库访问权限 | 必填。分两种情况填写： - 如果用户导入的源仓可见范围是对所有访客公开，勾选"不需要校验权限"。  - 如果用户导入的源仓可见范围是私仓，请勾选"需要校验权限"。当前支持"通过服务扩展点"和"通过用户名密码授权"进行鉴权，参数填写请参考[校验导仓权限](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0060.html)。   |
      
   
   
3. 单击"下一步"，进入"填写基本信息"页，请参考[填写仓库基本信息](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0074.html)填写参数。
4. 请参考[表1 同步仓库设置的参数表格](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0075.html#codeartsrepo_03_0075__table345171872217)，填写"同步仓库"设置参数。
 
 #### 相关文档
- 如果仓库过大或者网络较差时，仓库导入时间可能会超过30min。如果出现导入超时，建议使用客户端clone/push来处理，具体可参考[通过Git Bash导入SVN平台的代码仓库到CodeArts Repo]。
- 在线导入的操作方式简单，且将SVN中的分支、Tags进行平移，如果后续想在此代码仓的基础上继续开发，请使用Git Bash客户端导入，具体可参考[通过Git Bash导入SVN平台的代码仓库到CodeArts Repo]。
 
 #### 通过Git Bash导入SVN平台的代码仓库到CodeArts Repo
1. 获取SVN代码库提交者信息。
   
   1. 通过TortoiseSVN将待迁移的代码仓库下载到本地。
   
   2. 进入本地SVN代码仓库（本文为KotlinGallery），在Git Bash客户端执行如下命令：
      ```
      svn log --xml | grep "^<author" | sort -u | \awk -F '<author>' '{print $2}' | awk -F '</author>' '{print $1}' > userinfo.txt
      ```
      执行完毕后，"KotlinGallery"目录下将生成文件"userinfo.txt"，如下图所示。
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275753.png "点击放大")
      
   
   3. 打开文件"userinfo.txt"，可看到文件中显示所有对该仓库有提交操作的提交者信息。
   
   4. 因为Git是用邮箱来标识一个提交者的，为了更好地将SVN已有的信息映射到Git仓库里，需要从SVN用户名到Git做一个映射关系。 修改"userinfo.txt"，使每一行中，svn作者 = Git作者昵称 \<邮箱地址\>，映射关系的格式如下图所示。
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156088.png "点击放大")
      
   
   
   
   
2. 建立本地Git仓库**。**
   
   1. 执行命令git init，在本地新建一个空的Git代码仓库目录。
   
   2. 将[步骤1]中的"userinfo.txt"文件复制到该目录下，并执行如下命令切换到该目录下。
      ```
      cd 目标目录地址
      ```
      
   
   3. 在该目录下启动Git Bash客户端，并执行如下命令克隆一个Git版本库。
      ```
      git svn clone SVN仓库地址 --no-metadata --authors-file=userinfo.txt --trunk=trunk --tags=tags --branches=branches
      ```
      命令行中的参数说明如下，请根据实际情况选择相应参数:
      
      | **参数**                      | **说明**                                                    |
      |:---|:---|
      | --no-metadata               | 表示不将 SVN 的元数据导入到Git仓库中，这样能有效减少Git仓库的大小，但是可能会丢失一些SVN的历史信息。 |
      | --authors-file=userinfo.txt | 表示使用指定的用户信息文件来进行作者信息的映射。                                  |
      | --trunk=trunk               | 表示将SVN仓库中的"trunk"分支作为Git代码仓库的主分支。                         |
      | --tags=tags                 | 表示将SVN代码仓库中的tags目录作为Git代码仓库的Tag。                          |
      | --branches=branches         | 表示将SVN代码仓库中的branches目录作为Git代码仓库的分支。                       |
         
      执行成功后，本地将生成一个名为KotlinGallery的Git代码仓库。
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251275741.png "点击放大")
      
   
   4. 执行以下命令，进入"KotlinGallery"文件夹，并验证当前Git仓库分支结构。
      ```
      cd KotlinGallery
      git branch -a
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002251195857.png "点击放大")
      如上图所示，所有SVN中的目录结构均以Git分支的形式迁移成功。
      
   
   
   
   
3. 本地分支修正。 
   因此在上传到代码托管仓库前，需要先对本地分支进行调整，使之符合Git使用规范。
   1. 进入本地Git代码仓库目录下，在Git Bash客户端执行如下命令，把Tags分支变成合适的Git Tag。
      ```
      cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
      rm -Rf .git/refs/remotes/origin/tags
      git branch -a
      git tag
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216315908.png "点击放大")
      
   
   2. 执行以下命令，把"refs/remotes"下面剩下的索引变成本地分支。
      ```
      cp -Rf .git/refs/remotes/origin/* .git/refs/heads/
      rm -Rf .git/refs/remotes/origin
      git branch -a
      git tag
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216156092.png "点击放大")
      
   
   3. 执行以下命令，将trunk分支合入master分支，并删除trunk分支。
      ```
      git merge trunk
      git branch -d trunk
      git branch -a
      git tag
      ```
      ![](https://support.huaweicloud.com/usermanual-codeartsrepo/zh-cn_image_0000002216315904.png "点击放大")
      
   
   
   
   
4. 上传本地代码仓到CodeArts Repo。 
   1. 参考[配置SSH密钥](https://support.huaweicloud.com/usermanual-codeartsrepo/codeartsrepo_03_0011.html)，设置代码仓库的SSH密钥。
   
   2. 进入CodeArts Repo首页，单击"新建仓库"，在"归属项目"下拉框中选择已有的项目或者"新建项目"。
   
   3. 仓库类型选择"普通仓库"，填写对应参数信息并去勾选"允许生成README文件"和"选择gitignore"，完成新的代码仓库创建，并自动跳转到该代码仓库首页。
   
   4. 选择右上角的"克隆/下载" \> "用HTTPS克隆"，复制HTTPS地址。
   
   5. 执行以下命令，将本地代码仓库与CodeArts Repo进行关联，并推送master分支到CodeArts Repo的代码仓库。在执行命令时，需要用户输入CodeArts Repo的HTTPS账号和密码。
      ```
      git remote add origin 新建的代码仓库的HTTPS地址
      git push --set-upstream origin master
      ```
      推送成功后，进入该代码仓库首页，选择"代码" \> "分支"，查看到当前代码仓库下的master分支。
      
   
   6. 继续执行以下命令，把本地其余分支推送到CodeArts Repo。
      ```
      git push origin --all
      ```
      推送成功后，进入该代码仓库首页，选择"代码" \> "分支"，代码仓库下新增了r1.1_hotfix分支。
      
   
   7. 执行以下命令，从本地推送tags到CodeArts Repo。
      ```
      git push origin --tags
      ```
      推送成功后，进入该代码仓库首页，选择"代码" \> "Tags"，代码仓库下已有Tag"r1.0"与"r1.1"。
      
   
   
   
   
 
