svn 經常使用指令

1. 版本控制介紹

1.1. 什麼是版本控制

版本控制系統用於保存編寫開發應用程序時的文檔的各個修訂版(revision)。php

版本控制也稱做Revision Control System(RCS)。linux

名詞解釋:數據庫

  • 修訂版(revision):能夠認爲是某個文件在其生命週期內各個保存的快照,每一個快照和一個時間區間對應。
  • 版本庫(Repository):存放修訂版的數據庫
  • 本地工做拷貝(Local working copy):修訂版在本地的副本
  • 版本的檢入(Check in):本地副本提交到服務器的版本庫
  • 檢出(Check out):從服務器的版本庫中取出修訂版成爲本地副本
  • 版本號的來源:有兩種策略,基於文件的計數和基於倉庫的計數,subversion使用後者
  • 標籤(Tags):爲版本加一個名字,便於檢出
  • 分支(Branches):修訂版打分支,之後能夠平行修改,互不干擾
  • 合併(Merging):將分支的修訂版合併爲一個新的修訂版
  • 鎖(Locking):爲修訂版枷鎖
  • 衝突(Conflict):併發版本控制時防止修訂版混亂的錯誤機制

 

1.2. 使用版本控制的好處

 

對團隊和我的都有好處:apache

  • 爲團隊提供了全部項目文檔的回退按鈕;
  • 支持多個開發人員在可控的方式下爲相同的代碼工做;
  • 版本控制系統保存了文檔在過去的各個改動,便於查找是誰,在什麼時候,由於什麼修改了文檔;
  • 支持在文檔的主線上同時有多個版本;
  • 支持查詢在某個時點上項目各個文檔的狀態,可用於研究生產效率等,也可用於對之前的軟件發行版的再發行。

 

1.3. 常見的版本控制系統

 

 

2. Subversion介紹

 

Subversion是新一代的版本控制工具,正逐步替代CVS。dom

資源:eclipse

 

3. Subversion基本使用

 

 

3.1. Subversion安裝

 

Subversion是典型的C/S模式應用程序。

Windows環境下的安裝包:http://subversion.tigris.org/files/documents/15/41687/svn-1.4.6-setup.exe

安裝過程很簡單,圖形界面,默認選擇便可。

輸入svn命令查看安裝是否成功:

 

svn --version

 

svn命令是subversion程序的客戶端

svnserver命令能夠啓動svn服務器,用於搭建簡易的svn服務器環境

見:http://www.easymorse.com/bbs/viewthread.php?tid=95&extra=page%3D1

 

3.2. 服務器端

 

如下是搭建簡易的服務器端環境的作法,正式通常配合apache經過http訪問。

 

3.2.1. 建立版本庫

 

建立服務器端版本庫,至關於DBMS建立數據庫示例。

命令行:

 

svnadmin create file_path/repo_name

 

 

3.2.2. 啓動服務器

 

 

svnserve.exe -d  -r file_path

 

  • -d 後臺執行
  • -r 版本庫的根目錄

訪問該版本庫的url:svn//localhost/repo_name

 

3.3. 客戶端

 

 

3.3.1. 初始導入(import)

 

經過命令行導入:

 

svn import -m "init import" http://10.0.0.6/svn/teaching/

 

該命令可將當前路徑下文件導入到版本庫中。

 

3.3.2. 檢出(checkout)

 

經過命令行檢入:

 

svn co http://hibernate3demo.googlecode.com/svn/tags/helloworld_r1

 

或者:

 

svn checkout http://hibernate3demo.googlecode.com/svn/tags/helloworld_r1

 

或者:經過第三方圖形工具的檢出,好比tortoiseSVN(http://tortoisesvn.tigris.org/)

將svn服務器的最新修訂版下載到本地成爲本地工做拷貝。

 

3.3.3. 保持更新(update)

 

命令行:

 

svn update

 

或者

 

svn up

 

或者經過tortoiseSVN

或者經過eclipse插件,subclipse(http://subclipse.tigris.org/),在線安裝:http://subclipse.tigris.org/update_1.2.x/

用svn服務器的最新修訂版更新本地工做拷貝。

多人合做時:

  • 更新要常常頻繁的作,儘可能讓問題及早暴露,便於處理。
  • 提交代碼前要更新,不然容易產生版本衝突。

 

3.3.4. 添加(add)

 

命令行:

 

svn add file_path

 

或者經過tortoiseSVN,eclipse插件。

告知svn服務器,添加目錄和/或文件到服務器上,這個操做相似SQL的insert,可是並無真的操做,直到commit。

 

3.3.5. 提交改動

 

至關於通用概念:檢入(checkin)。

命令行:

 

svn commit

 

或者:

 

svn ci

 

或者經過tortoiseSVN,eclipse插件。

提交本地工做拷貝的全部改動,並且是原子性的。

要求:通常要註明修改的緣由

 

svn ci -m "修改bug #224"

 

要求:提交以前要作更新

 

svn up
svn ci -m "修改bug #224"

 

 

3.3.6. 還原改動

 

對應提交(commit),要有相似回滾(rollback)的操做。

 

svn revert

 

或者經過tortoiseSVN,eclipse插件。

這個操做對開發人員十分有用,在改動被人不少代碼後能夠「一鍵恢復」。

 

3.3.7. 「還原」已提交的改動

 

revert只適合未提交的狀況。

若是已經提交,發現問題,要回退到以前的修訂版。

首先須要:

 

svn up

 

讓本地工做拷貝更新到最新狀態。

而後:

 

svn log your_file_path

 

查看文件日誌,這時候提交時填寫的說明信息就派上用場了。

查看兩個修訂版之間的不一樣:

 

svn diff -r 舊修訂版序號:新修訂版序號 your_file_path

 

或者經過tortoiseSVN,eclipse插件。

決定用哪一個舊的修訂版號後,用舊的修訂版號文件覆蓋新的修訂版號文件。

 

svn merge -r 新修訂版序號:舊修訂版序號 your_file_path

 

還須要:

 

svn commit -m "恢復到某修訂版(某修訂版做廢)"

 

或者經過tortoiseSVN,eclipse插件。

這個還原是所謂的,不是用舊的版本號替代,而是將舊文件覆蓋新文件。

 

3.3.8. 拷貝文件和目錄

 

命令行:

 

svn copy path/file_name newpath/new_file_name
svn commit -m "xxxx"

 

或者:

 

svn cp path/file_name newpath/new_file_name
svn commit -m "xxxx"

 

或者:利用windows的資源管理器/unix的cp命令

或者經過tortoiseSVN,eclipse插件。

svn的copy,是很重要的工具,版本分支和標籤等概念都經過它實現。

svn的copy,是廉價的拷貝。

 

3.3.9. 重命名目錄/文件

 

命令行:

 

svn move file_name new_file_name

 

或者:

 

svn mv file_name new_file_name

 

 

3.3.10. 處理合並衝突

 

svn默認不對文件加鎖。

若是不一樣人編輯了同一個文件的不一樣部分,提交時會自動合併。

若是不一樣人編輯了同一個文件的同一部分,後提交者會報告合併衝突。

解決方法(人工仲裁):

  • 放棄改動;
  • 堅持你的改動,找到.mine的文件名,恢復爲原文件名,而後執行:
    svn resolved file_name
     

 

3.3.11. 刪除文件

 

將本地工做拷貝刪除。

命令行:

 

svn delete file_path

 

或者:

 

svn del file_path 

4. Subversion高級內容

 

4.1. 文件鎖

 

通常用於二進制內容,由於沒法合併。

若是某個文件加鎖,其餘用戶的本地工做拷貝(更新後)將是隻讀的。

當該用戶提交後,其餘用戶的本地工做拷貝(更新後)才能夠寫操做。

其餘用戶能夠「撬鎖」,而後進行寫操做。

高級配置能夠配置「撬鎖」權限,使不是什麼人均可以「撬鎖」。

 

4.2. 版本庫建立策略

 

單一的版本庫保存一個項目。

單一的版本庫保存多個項目。

多個版本庫。

 

4.3. 使用標籤和分支

 

在svn中標籤和分支都源於copy命令。

3個約定俗成的目錄:

  • trunk:主幹
  • branches:分支
  • tags:標籤

發佈分支:

 

svn cp -m "建立用於實現radio標籤的分支" https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_1 https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2

 

切換分支:

 

svn switch https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2

 

合併分支須要兩個步驟:

合併操做

 

svn merge -r 33:HEAD https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2

 

或者:

 

svn merge https://easymorse-simpletag.googlecode.com/svn/trunk/simpletag@HEAD https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_1@HEAD

 

提交。

 

5. 未講到的內容

 

  • svn備份
  • subversion屬性
  • 與apache集成的配置和使用

 


原文連接:http://www.iteye.com/topic/28013

一直以來用svn只是看成cvs,也歷來沒有仔細看過文檔,直到今天用到,纔去翻看svn book文檔,慚愧 

需求一: 
有一個客戶想對產品作定製,可是咱們並不想修改原有的svn中trunk的代碼。 

方法: 
用svn創建一個新的branches,從這個branche作爲一個新的起點來開發 

  1. svn copy svn://server/trunk svn://server/branches/ep -m "init ep"  



Tip: 
若是你的svn中之前沒有branches這個的目錄,只有trunk這個,你能夠用 

  1. svn mkdir branches  


新建個目錄 


需求二: 
產品開發已經基本完成,而且經過很嚴格的測試,這時候咱們就想發佈給客戶使用,發佈咱們的1.0版本 

  1. svn copy svn://server/trunk svn://server/tags/release-1.0 -m "1.0 released"  



咦,這個和branches有什麼區別,好像啥區別也沒有? 
是的,branches和tags是同樣的,都是目錄,只是咱們不會對這個release-1.0的tag作修改了,再也不提交了,若是提交那麼就是branches 



需求三: 
有一天,忽然在trunk下的core中發現一個致命的bug,那麼全部的branches必定也同樣了,該怎麼辦? 

  1. svn -r 148:149 merge svn://server/trunk branches/ep  


其中148和149是兩次修改的版本號。 


其餘的呢?看文檔

 


 

原文地址:http://blog.chinaunix.net/space.php?uid=22976768&do=blog&id=1640924

 
 
windows下的TortoiseSVN是資源管理器的一個插件,以覆蓋圖標表示文件狀態,幾乎因此命令都有圖形界面支持,比 較好用,這裏就很少說。主要說說linux下svn的使用,由於linux下大部分的操做都是經過命令行來進行,因此必須得掌握linux下svn的經常使用 指令。固然linux下也有模仿TortoiseSVN的linux X程序,例如RabbitVCS,模仿程度很高,但很容易拖慢X,所以不推薦。
    (若是是第一次提交文件,極可能會出現「svn:'.'不是工做副本」,即當前目錄不是工做副本,這個時候須要用到import:
eg:svn import . url)
一、將文件checkout到本地目錄
svn checkout path(path是服務器上的目錄)
例如:svn checkout svn://192.168.1.1/pro/domain
簡寫:svn co
二、往版本庫中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加當前目錄下全部的php文件) 
三、將改動的文件提交到版本庫
svn commit -m 「LogMessage「 [-N] [--no-unlock] PATH(若是選擇了保持鎖,就使用–no-unlock開關)
例如:svn commit -m 「add test file for my test「 test.php
簡寫:svn ci
四、加鎖/解鎖
svn lock -m 「LockMessage「 [--force] PATH
例如:svn lock -m 「lock test file「 test.php
svn unlock PATH 
五、更新到某個版本
svn update -r m path
例如:
svn update若是後面沒有目錄,默認將當前目錄以及子目錄下的全部文件都更新到最新版本。
svn update -r 200 test.php(將版本庫中的文件test.php還原到版本200)
svn update test.php(更新,於版本庫同步。若是在提交的時候提示過時的話,是由於衝突,須要先update,修改文件,而後清除svn resolved,最後再提交commit)
簡寫:svn up 
六、查看文件或者目錄狀態
1)svn status path(目錄下的文件和子目錄的狀態,正常狀態不顯示)
【?:不在svn的控制中;M:內容被修改;C:發生衝突;A:預約加入到版本庫;K:被鎖定】M狀態通常比較多
2)svn status -v path(顯示文件和子目錄狀態)
第一列保持相同,第二列顯示工做版本號,第三和第四列顯示最後一次修改的版本號和修改人。
注:svn status、svn diff和 svn revert這三條命令在沒有網絡的狀況下也能夠執行的,緣由是svn在本地的.svn中保留了本地版本的原始拷貝。
簡寫:svn st 
七、刪除文件
svn delete path -m 「delete test fle「
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m 「delete test file」
或者直接svn delete test.php 而後再svn ci -m ‘delete test file‘,推薦使用這種
簡寫:svn (del, remove, rm)
八、查看日誌
svn log path
例如:svn log test.php 顯示這個文件的全部修改記錄,及其版本號的變化
九、查看文件詳細信息
svn info path
例如:svn info test.php
十、比較差別
svn diff path(將修改的文件與基礎版本比較)
例如:svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差別)
例如:svn diff -r 200:201 test.php
簡寫:svn di 
十一、將兩個版本之間的差別合併到當前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(將版本200與205之間的差別合併到當前文件,可是通常都會產生衝突,須要處理一下)
十二、SVN 幫助
svn help
svn help ci
——————————————————————————
以上是經常使用命令,下面寫幾個不常常用的
——————————————————————————
1三、版本庫下的文件和目錄列表
svn list path
顯示path目錄下的全部屬於版本庫的文件和目錄
簡寫:svn ls
1四、建立歸入版本控制下的新目錄
svn mkdir: 建立歸入版本控制下的新目錄。
用法: 一、mkdir PATH…
二、mkdir URL…
建立版本控制的目錄。
一、每個以工做副本 PATH 指定的目錄,都會建立在本地端,而且加入新增
調度,以待下一次的提交。
二、每一個以URL指定的目錄,都會透過當即提交於倉庫中建立。
在這兩個狀況下,全部的中間目錄都必須事先存在。 
1五、恢復本地修改
svn revert: 恢復原始未改變的工做副本文件 (恢復大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不會存取網絡,而且會解除衝突的情況。可是它不會恢復
被刪除的目錄 
1六、代碼庫URL變動
svn switch (sw): 更新工做副本至不一樣的URL。
用法: 一、switch URL [PATH]
      二、switch –relocate FROM TO [PATH...] 
  一、更新你的工做副本,映射到一個新的URL,其行爲跟「svn update」很像,也會將服務器上文件與本地文件合併。這是將工做副本對應到同一倉庫中某個分支或者標記的方法。
  二、改寫工做副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變更
(好比方案名或是主機名稱變更),可是工做副本仍舊對映到同一倉庫的同一目錄時使用
這個命令更新工做副本與倉庫的對應關係。
1七、解決衝突
svn resolved: 移除工做副本的目錄或文件的「衝突」狀態。
用法: resolved PATH…
注意: 本子命令不會依語法來解決衝突或是移除衝突標記;它只是移除衝突的
相關文件,而後讓 PATH 能夠再次提交。 
1八、輸出指定文件或URL的內容。
svn cat 目標[@版本]…若是指定了版本,將從指定的版本開始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也能夠寫具體版本號,這樣輸出結果是能夠提交的)

相關文章
相關標籤/搜索