svn 常用指令


1. 版本控制介紹

1.1. 什么是版本控制

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

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

名詞解釋:

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

 

1.2. 使用版本控制的好處

 

對團隊和個人都有好處:

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

 

1.3. 常見的版本控制系統

 

 

2. Subversion介紹

 

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

資源:

 

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)
1、將文件checkout到本地目錄
svn checkout path(path是服務器上的目錄)
例如:svn checkout svn://192.168.1.1/pro/domain
簡寫:svn co
2、往版本庫中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加當前目錄下所有的php文件) 
3、將改動的文件提交到版本庫
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果選擇了保持鎖,就使用–no-unlock開關)
例如:svn commit -m “add test file for my test“ test.php
簡寫:svn ci
4、加鎖/解鎖
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH 
5、更新到某個版本
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 
6、查看文件或者目錄狀態
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 
7、刪除文件
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)
8、查看日志
svn log path
例如:svn log test.php 顯示這個文件的所有修改記錄,及其版本號的變化
9、查看文件詳細信息
svn info path
例如:svn info test.php
10、比較差異
svn diff path(將修改的文件與基礎版本比較)
例如:svn diff test.php
svn diff -r m:n path(對版本m和版本n比較差異)
例如:svn diff -r 200:201 test.php
簡寫:svn di 
11、將兩個版本之間的差異合並到當前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(將版本200與205之間的差異合並到當前文件,但是一般都會產生沖突,需要處理一下)
12、SVN 幫助
svn help
svn help ci
——————————————————————————
以上是常用命令,下面寫幾個不經常用的
——————————————————————————
13、版本庫下的文件和目錄列表
svn list path
顯示path目錄下的所有屬於版本庫的文件和目錄
簡寫:svn ls
14、創建納入版本控制下的新目錄
svn mkdir: 創建納入版本控制下的新目錄。
用法: 1、mkdir PATH…
2、mkdir URL…
創建版本控制的目錄。
1、每一個以工作副本 PATH 指定的目錄,都會創建在本地端,並且加入新增
調度,以待下一次的提交。
2、每個以URL指定的目錄,都會透過立即提交於倉庫中創建。
在這兩個情況下,所有的中間目錄都必須事先存在。 
15、恢復本地修改
svn revert: 恢復原始未改變的工作副本文件 (恢復大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不會存取網絡,並且會解除沖突的狀況。但是它不會恢復
被刪除的目錄 
16、代碼庫URL變更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
      2、switch –relocate FROM TO [PATH...] 
  1、更新你的工作副本,映射到一個新的URL,其行為跟“svn update”很像,也會將服務器上文件與本地文件合並。這是將工作副本對應到同一倉庫中某個分支或者標記的方法。
  2、改寫工作副本的URL元數據,以反映單純的URL上的改變。當倉庫的根URL變動
(比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用
這個命令更新工作副本與倉庫的對應關系。
17、解決沖突
svn resolved: 移除工作副本的目錄或文件的“沖突”狀態。
用法: resolved PATH…
注意: 本子命令不會依語法來解決沖突或是移除沖突標記;它只是移除沖突的
相關文件,然后讓 PATH 可以再次提交。 
18、輸出指定文件或URL的內容。
svn cat 目標[@版本]…如果指定了版本,將從指定的版本開始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以寫具體版本號,這樣輸出結果是可以提交的)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM