文章

svn 常用的几个命令

svn 常用的几个命令

SVN Logo Apache Subversion (简称 svn) 是一个功能齐全的版本控制系统,最初旨在成为更好的 CVS。此后,Subversion 已经超越了取代 CVS 的最初目标,但其基本模型、设计和界面仍然受到该目标的严重影响。即使在今天,Subversion 仍然对 CVS 用户来说仍然非常熟悉。

这篇文章只简单记录几个 svn 常用的命令,如果你想了解更多请查看官方文档:Quick Start

项目上传到(import)

1
svn import -m "New Import" ./MyProject/ http://svn_server/ios/trunk/MyProject  # 将本地 MyProject 目录下的所有文件提交到服务器 `/trunk/MyProject` 目录

检出代码(checkout)

1
2
svn co http://svn_server/ios/trunk/MyProject           # 检出最新版本到本地
svn co -r 版本号 http://svn_server/ios/trunk/MyProject  # 检出指定版本到本地

往版本库中添加新的文件(add)

1
2
svn add filename # 添加指定文件
svn add *        # 添加所有文件

将改动的文件提交到服务器(commit)

1
svn ci -m "日志消息" # 将该路径下所有修改的文件提交到服务器

将服务器的代码更新到本地(update)

1
svn up

创建分支(copy)

1
svn cp -m "create branch" http://svn_server/ios/trunk/MyProject http://svn_server/ios/branches/NewBranch  # 将主干 MyProject 拷贝一份到分支 NewBranch

合并主干代码到分支(merge)

1
2
cd NewBranch  # 切换到本地分支目录
svn merge http://svn_server/ios/trunk/MyProject # 将服务器主干代码合并到本地

先将服务器上的主干代码合并到本地分支;合并好并且确保本地分支运行没问题后再讲本地分支代码提交到服务器

合并分支代码到主干(merge)

1
2
cd MyProject # 切换到本地主干目录
svn merge http://svn_server/ios/branches/NewBranch # 将服务器分支代码合并到本地

创建tags(copy)

1
svn cp http://svn_server/ios/trunk/MyProject http://svn_server/ios/tags/tag-1.0 -m "create tag"

删除分支或tags(delete、del、remove)

1
2
svn rm -m "rm branch" http://svn_server/ios/branches/NewBranch
svn rm -m "rm tag" http://svn_server/ios/tags/tag-1.0

冲突解决(resolve)

  1. svn up 时如果有冲突发送 svn 通常会有以下提示(注意:“#”后面是我添加的注释):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    U    Classes/Message/FriendsViewController.swift                  # U 该文件有修改
    C    Classes/AppDelegate.swift                                    # C 该文件在更新时发生冲突
    R    Vendor/Web.bundle/index.html                                 # R 这个文件预定要被替换
    U    Demo.xcodeproj/project.pbxproj                               # U 该文件有修改
    --- Recording mergeinfo for merge of r709 through r730 into '.':  # 记录合并信息
    U   .
    Summary of conflicts:                                             # 冲突总结:
    Text conflicts: 1                                                 # 有1个文本冲突
    Conflict discovered in file 'Classes/AppDelegate.swift'.          # 文件“Classes/AppDelegate.swift”中发现冲突。
    Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,   # 选择:(p)标记冲突,稍后解决,(df)把所有的修改列出来,(e)直接编辑冲突的文件,(m)合并(这个我目前还没用过),
    (mc) my side of conflict, (tc) their side of conflict,    #(mc)冲突以本地为准,(tc)冲突以服务器为准 ,
    (s) show all options:                                     #(s)显示其他可用的命令
    
  2. 遇到冲突我们需要和那个与我发生冲突的哥们商量一番,所以需要推迟处理。选择:p 终端输出如下:

    1
    2
    
    Summary of conflicts:                 # 冲突总结:
    Text conflicts: 1                     # 总共有1个文本冲突
    
  3. 现在我们开始解决冲突,打开 Classes/AppDelegate.swift 文件,找到冲突。(注意:“#”后面是我添加的注释):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    <<<<<<< .working           // 我当前本地的版本(我把这个“友盟统计”的注释给去掉了,因为他还有用。)
    // 友盟统计
    UMAnalyticsConfig.sharedInstance().appKey = "------"
    MobClick.start(withConfigure: UMAnalyticsConfig.sharedInstance())
    
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        MobClick.setAppVersion(version)
    }
    
    ||||||| .merge-left.r708   // 我修改之前的版本(以前这个“友盟统计”被注释掉了)
    //        // 友盟统计
    //        UMAnalyticsConfig.sharedInstance().appKey = "------"
    //        MobClick.start(withConfigure: UMAnalyticsConfig.sharedInstance())
    //        if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
    //            MobClick.setAppVersion(version)
    //        }
    =======                    // 另外一个哥们的修改版本(他觉得这个“友盟统计”被注释掉了就没用了,所以就给删了。简单粗暴🤣🤣🤣)
    >>>>>>> .merge-right.r730
    

    经过讨论这个“友盟统计”还是有用的,所以以我当前本地版本为准。修改如下:

    1
    2
    3
    4
    5
    6
    7
    
    // 友盟统计
    UMAnalyticsConfig.sharedInstance().appKey = "------"
    MobClick.start(withConfigure: UMAnalyticsConfig.sharedInstance())
       
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        MobClick.setAppVersion(version)
    }
    
  4. 冲突文件修改好了。在终端输入 svn st 命令查看下当前 svn 状态:

    1
    2
    3
    4
    5
    6
    
    LiamMacBook-Pro:Demo liam$ svn st
    U       Classes/Message/FriendsViewController.swift
    C       Classes/AppDelegate.swift
    R       Vendor/Web.bundle/index.html
    U       Demo.xcodeproj/project.pbxproj
    ?       Demo.xcodeproj/project.xcworkspace/xcshareddata/Demo.xcscmblueprint
    

    我们发现 Classes/AppDelegate.swift 这个文件的标记还是冲突 “C” 状态。我们需要用 resolve 命令去掉这个标记。命令如下:

    1
    2
    
    LiamMacBook-Pro:Demo liam$ svn resolve --accept working Classes/AppDelegate.swift
    Resolved conflicted state of 'Classes/AppDelegate.swift'
    

    再次查看svn状态。Classes/AppDelegate.swift 的标记已经变成“M”了。

    1
    2
    3
    4
    5
    6
    
    LiamMacBook-Pro:Demo liam$ svn st
    M       Classes/Message/FriendsViewController.swift
    M       Classes/AppDelegate.swift
    R       Vendor/Web.bundle/index.html
    M       Demo.xcodeproj/project.pbxproj
    ?       Demo.xcodeproj/project.xcworkspace/xcshareddata/Demo.xcscmblueprint
    

    到此 svn 已经恢复正常状态。我们可以进行 commit 等操作了。

加锁(lock)

1
svn lock -m "日志消息" test.h  # 给 test.h 文件加锁

解锁(unlock)

1
svn unlock test.h  # 给 test.h 文件解锁

查看日志(log)

1
svn log test.h  # 显示 test.h 文件的所有修改日志

查看文件详细信息(info)

1
svn info test.h # 查看 test.h 文件详细信息

比较差异(diff)

1
2
svn di test.h         # 比较修改后的 test.h 文件与基础版本的差异
svn di -r m:n test.h  # 比较版本 m 和版本 n 的差异

注:推荐使用 xcode 会更加清晰明了

SVN 帮助(help)

1
2
svn help
svn help ci  # 查询 ci 命令的帮助

变更 svn 地址(switch)

1
svn switch --relocate http://old_svn_server http://new_svn_server
本文由作者按照 CC BY 4.0 进行授权