svn 經常使用操做命令及問題處理

[TOC]shell


1. 經常使用命令

1.1. 基本使用

  • 檢出 checkoutvim

    # 檢出代碼
    ➜  svn co repo_url
    
    # 檢出代碼,並指定目錄名
    ➜  svn co repo_url saved_dir_name
  • 加入版本控制 addcentos

    # 添加指定文件
    ➜  svn add /path/to/file
    
    # 添加全部 .sh 後綴的文件
    ➜  svn add *.sh
    
    # 遞歸添加當前目錄下的全部新文件
    # 若是使用參數 --no-ignore 則新增時會包含被設置爲忽略的文件
    ➜  svn add . --force
  • 提交 commit緩存

    ➜  svn ci -m '提交更改'
  • 更新 update服務器

    ➜  svn up [file|path]
    
    # 更新到指定版本 11
    ➜  svn up -r 11 [file|path]
  • 清除鎖定 svn cleanupsvn

  • 重定向倉庫地址到新地址post

    ➜  svn switch --relocate old_repo_url new_repo_url
  • 切換當前項目到指定分支測試

    ➜  svn switch svn://branch_url
  • 檢查工做副本下的文件狀態 svn stui

  • 查看工做副本的版本庫概覽信息 svn infourl

  • 查看版本庫上某個目錄下的文件列表(不須要本地檢出)

    ➜  svn list svn://192.168.1.15/blog

1.2. 分支和標籤

  • 建立 branch、tag

    ➜  svn cp svn://trunk_url svn://branch_url -m '建立分支'
    ➜  svn mkdir svn://branch_url -m '建立空分支'
    ➜  svn cp svn://trunk_url tag_url -m '建立標籤'
  • 刪除 branch、tag

    ➜  svn rm svn://branch_url -m '刪除分支'
    ➜  svn rm svn://branch_url -m '刪除標籤'
  • 查看 branch、tag

    ➜  svn ls ^/branches --verbose
    ➜  svn ls ^/tags --verbose

1.3. 歷史記錄

  • 查看提交記錄

    # 查看整個項目或指定文件目錄的提交記錄
    ➜  svn log [file|dir]
    
    # 查看兩個指定版本之間的提交記錄
    ➜   svn log -r 11:5 [file|dir]
    
    # 查看最新的 5 條提交記錄
    ➜  svn log -l 5 [file|dir]
    
    # 查看帶目錄信息的提交記錄
    ➜  svn log -l 5 -v [file|dir]
  • 查看指定版本號的文件內容

    ➜  svn cat file -r 版本號
  • 查看文件的修改詳情(行級)

    # 比較工做副本下的文件與緩存在 .svn 的「原始」拷貝
    ➜  svn diff
    
    # 比較工做副本下的文件與指定版本號 5 下的文件
    ➜  svn diff -r 5 file
    
    # 比較兩個版本庫下的文件
    ➜  svn diff -r 11:2 file
  • 查看文件每一行的最後修改人

    ➜  svn blame file

1.4. 忽略文件

  • 基本使用

    # 忽略指定文件或目錄
    svn propset svn:ignore 'file|dir' dir
    
    # 忽略當前目錄中全部以 .log 結尾的文件
    # . 表示當前目錄,當指定具體目錄時,該目錄需處於版本控制狀態
    svn propset svn:ignore -R '*.log' .
    svn ci -m 'ignore *.log file'
  • 要忽略的文件已經被 add 過了

    • 未提交
    svn revert -R [file|dir]
    • 已提交
    svn del [file|dir]
    
    # 只從 svn 中忽略,而不刪除本地文件
    svn del --keep-local [file|dir]

    而後再執行忽略設置並提交。

  • 使用配置文件

    新建 .svnignore 文件,寫入相似以下內容:

    runtime
    *.log
    *.apk  
    *.class

    而後執行設置

    svn add .svnignore
    svn propset svn:ignore -R -F .svnignore .

    提交設置

    svn ci -m 'add .svnignore and set some ignore'

1.5. 小技巧

  • 建立了一個文件夾,而且把它加入版本控制,但忽略文件夾中的全部內容

    ➜  svn mkdir dir2 
    ➜  svn propset svn:ignore '*' dir2 
    ➜  svn ci -m 'Adding "dir2" and ignoring its contents.'
  • 建立一個不加入版本控制(忽略)的文件夾

    ➜  mkdir dir1 
    ➜  svn propset svn:ignore 'dir1' . 
    ➜  svn ci -m 'Ignoring a directory called "dir1".'
  • 導入一個目錄 import

    ➜  svn import /tmp/upload svn://192.168.0.1/repo1 -m 'add module upload'

2. 合併 merge

2.1. 分支合併到主幹

⚠️注意:分支合併到主幹後應當刪除該分支,由於在 SVN 中該分支已經不能進行刷新也不能合併到主幹。

# 進入主幹目錄
➜  cd trunk

# 查看建立分支時的版本號
➜  svn log -q -v -l 1 --stop-on-copy svn://branch_url

# 合併分支上的最新代碼到主幹
# svn1.8+ 能夠不加參數 --reintegrate
➜  svn merge --reintegrate svn://branch_url

# 查看分支中哪些改動已經被合併到主幹
➜  svn mergeinfo svn://branch_url

# 查看分支哪些改動還未合併
➜  svn mergeinfo svn://branch_url --show-revs eligible

# ⚠️ 提交本次合併(不提交的話,合併不會生效,也會影響後面的更新操做)
➜  svn ci -m 'merge from branch r11:r5 into trunk'

2.2. 主幹合併到分支

# 進入分支目錄
➜  cd branch

# 合併以前,可使用 svn mergeinfo 命令查看主幹上有哪些待合併的版本信息
➜  svn mergeinfo -v svn://trunk_url --show-revs eligible --log

# 合併主幹上最新代碼到分支
➜  svn merge svn://trunk_url

# ⚠️ 提交本次合併(不提交的話,合併不會生效,也會影響後面的更新操做)
➜  svn ci -m 'merge from trunk r11:r5 into branch'

3. 回滾 rollback

3.1. 未提交使用 revert

# 查看文件狀態
➜  svn status

# 回滾單個文件
➜  svn revert /path/to/file_name

# 回滾一個目錄
➜  svn revert dir_name

# 回滾整個項目
➜  cd trunk
➜  svn revert -R .

3.2. 已提交使用 merge -r

  1. 先更新到最新代碼

    # 這裏獲得最新版本號 11
    ➜  svn up
    Updating '.':
    At revision 11.
  2. 找到要回滾到的版本號

    # 查看最新的 50 次提交記錄
    # 最後的參數能夠指定文件或目錄
    ➜  cd trunk
    ➜  svn log -l 50 [file|dir]

    假如咱們想要回退到的版本是 5,能夠執行命令 svn diff -r 11:5 [file|dir] 簡單查看兩個版本的區別。

  3. 回滾到指定版本號

    ➜  svn merge -r 11:5 [file|dir]

    驗證回滾是否成功

    ➜  svn diff -r [file|dir]
  4. 提交本次回滾操做到倉庫

    ➜  svn ci -m "Revert revision from r28 to r25,because of ..."
  5. 其它地方更新本次回滾操做

    ➜  svn up

3.3. 回退誤操做的 svn up

場景:咱們有一個目錄是穩定版本的環境,由於誤操做執行了 svn up 後,代碼被更新到了倉庫中的最新版本,而最新版尚未測試經過,因此咱們須要先將更新的代碼回滾,以下:

➜  cd trunk
➜  svn merge -r 13410:13962 .

⚠️注意:千萬不要提交,不然倉庫中的代碼也會回滾,而咱們只但願本地目錄回滾,等到能夠執行 svn up 的時候,再恢復:

➜  svn revert -R .
➜  svn up

4. 附錄1

4.1. 命令簡寫對照

  • svn checkout ---> svn co
  • svn update ---> svn up
  • svn commit ---> svn ci
  • svn delete ---> svn rmsvn del
  • svn copy ---> svn cp
  • svn list ---> svn ls
  • svn status ---> svn st
  • svn switch ---> svn sw
  • svn diff ---> svn di

4.2. 處理衝突

# 查找合併時的衝突文件,手工解決衝突
➜  svn st | grep ^C      
# 告知svn衝突已解決
➜  svn resolved filename 
# 提示合併後的版本
➜  svn commit -m ""
  • (p) postpone 暫時推後處理,我可能要和那個和我衝突的傢伙商量一番
  • (df) diff-full 把全部的修改列出來,比比看
  • (e) edit 直接編輯衝突的文件
  • (mc) mine-conflict 若是你頗有自信能夠只用你的修改,把別人的修改幹掉
  • (tc) theirs-conflict 底氣不足,仍是用別人修改的吧
  • (s) show all options 顯示其餘可用的命令

4.3. 文件符號狀態

  • U: 表示從服務器收到文件更新了
  • G: 表示本地文件以及服務器文件都已更新,並且成功的合併了
  • A: 表示有文件或者目錄添加到工做目錄
  • R: 表示文件或者目錄被替換了.
  • C: 表示文件的本地修改和服務器修改發生衝突

4.4. 如何遷移倉庫

  1. 備份源倉庫

    svnadmin dump /path/to/repo > repo.dump

  2. 新建倉庫

    svnadmin create new_repo

    注意:若是是遷移到 Windows 下,使用 VisualSVN 建立新倉庫時,不要建立默認目錄結構(branches、trunk、tags),不然在導入備份時候可能由於目錄衝突發生報錯而中斷。

  3. 從備份文件導入新建的倉庫

    svnadmin load /path/to/new_repo < repo.dump

建議:切換代碼的 svn 倉庫地址時,最好使用新 svn 地址進行從新檢出的方式操做;若是直接使用 svn switch --relocate svn://svn_old svn://svn_new 進行切換,有可能報相似 uuid 衝突的錯誤。

5. 附錄2:常見問題處理

  • svn: Can't convert string from 'UTF-8' to native encoding

    解決

    ➜  echo "export LC_ALL=zh_CN.UTF-8" >> /etc/profile
    ➜  source /etc/profile
  • SSL handshake failed: SSL 錯誤:Key usage violation in certificate has been detected.

    場景:在 CentOS 服務器上,經過 svn 命令檢出 VisualSVN 管理的倉庫代碼時。

    解決:安裝高版本的 svn ,以下

    • 添加軟件源 vim /etc/yum.repos.d/wandisco-svn.repo

      [WandiscoSVN]
      name=Wandisco SVN Repo
      baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.8/RPMS/$basearch/
      enabled=1
      gpgcheck=0
    • 刪除舊版本 yum remove subversion*

    • 安裝新版本

      yum clean all
      yum install subversion
相關文章
相關標籤/搜索