作者:vwFisher
時(shí)間:2019-07-16
可參考文檔:https://www.kancloud.cn/i281151/svn/197154
IDEA配置:https://blog.csdn.net/hello__word__/article/details/81773815
Windows-TortoiseSVN 使用教程:https://www.runoob.com/svn/tortoisesvn-intro.html
目錄
- 1 SVN簡介
-
2 SVN 命令實(shí)戰(zhàn)
- 2.1 SVN 啟動(dòng)模式
- 2.2 svnadmin create 創(chuàng)建版本庫
- 2.3 svn checkout 檢出操作
- 2.4 svn export 導(dǎo)出
- 2.5 svn info 查看信息
- 2.6 svn add 添加文件
- 2.7 svn commit 提交
- 2.8 svn update更新文件
- 2.9 svn status 目錄文件狀態(tài)
- 2.10 svn delete 刪除文件
- 2.11 svn lock/unlock 加鎖/解鎖
- 2.12 svn diff 比較差異
- 2.13 svn log 查看提交日志
- 2.14 svn cat 查看過去版本
- 2.15 svn list 查看目錄文件
- 2.16 svn mkdir 創(chuàng)建納入版本控制下的新目錄
- 2.17 svn revert 恢復(fù)本地修改
- 2.18 svn revert 版本回退
- 2.19 svn resolve/resolved 解決沖突
- 2.20 svn switch 把工作拷貝更新到別的URL
- 2.21 svn copy 新建分支
- 2.22 svn merge 合并分支
- 個(gè)性化定制 (只是簡單例子)
- 3. 開發(fā)實(shí)戰(zhàn)
1 SVN簡介
Subversion(SVN) 是一個(gè)開源的版本控制系統(tǒng), 也就是說 Subversion 管理著隨時(shí)間改變的數(shù)據(jù)机错。 這些數(shù)據(jù)放置在一個(gè)中央資料檔案庫(repository) 中。 這個(gè)檔案庫很像一個(gè)普通的文件服務(wù)器, 不過它會(huì)記住每一次文件的變動(dòng)撞芍。 這樣你就可以把檔案恢復(fù)到舊的版本, 或是瀏覽文件的變動(dòng)歷史方庭。
優(yōu)于CVS之處:
- 原子提交销钝。一次提交不管是單個(gè)還是多個(gè)文件有咨,都是作為一個(gè)整體提交的。在這當(dāng)中發(fā)生的意外例如傳輸中斷蒸健,不會(huì)引起數(shù)據(jù)庫的不完整和數(shù)據(jù)損壞座享。
- 重命名婉商、復(fù)制、刪除文件等動(dòng)作都保存在版本歷史記錄當(dāng)中渣叛。
- 對于二進(jìn)制文件丈秩,使用了節(jié)省空間的保存方法。(簡單的理解淳衙,就是只保存和上一版本不同之處)
- 目錄也有版本歷史蘑秽。整個(gè)目錄樹可以被移動(dòng)或者復(fù)制,操作很簡單箫攀,而且能夠保留全部版本記錄肠牲。
- 分支的開銷非常小。
- 優(yōu)化過的數(shù)據(jù)庫訪問靴跛,使得一些操作不必訪問數(shù)據(jù)庫就可以做到缀雳。這樣減少了很多不必要的和數(shù)據(jù)庫主機(jī)之間的網(wǎng)絡(luò)流量。
1.1 SVN 的一些概念
- repository(源代碼庫):源代碼統(tǒng)一存放的地方
- checkout(提取):當(dāng)你手上沒有源代碼的時(shí)候梢睛,你需要從repository checkout一份
- commit(提交):當(dāng)你已經(jīng)修改了代碼肥印,你就需要Commit到repository
- update(更新):當(dāng)你已經(jīng)Checkout了一份源代碼, Update一下你就可以和Repository上的源代碼同步扬绪,你手上的代碼就會(huì)有最新的變更
日常開發(fā)過程其實(shí)就是這樣的(假設(shè)你已經(jīng)Checkout并且已經(jīng)工作了幾天):Update(獲得最新的代碼) --> 作出自己的修改并調(diào)試成功 --> Commit(大家就可以看到你的修改了) 。
如果兩個(gè)程序員同時(shí)修改了同一個(gè)文件呢, SVN可以合并這兩個(gè)程序員的改動(dòng)裤唠,實(shí)際上SVN管理源代碼是以行為單位的挤牛,就是說兩個(gè)程序員只要不是修改了同一行程序,SVN都會(huì)自動(dòng)合并兩種修改种蘸。如果是同一行墓赴,SVN會(huì)提示文件Confict, 沖突,需要手動(dòng)確認(rèn)航瞭。
1.2 SVN 的主要功能
- 目錄版本控制
- CVS 只能跟蹤單個(gè)文件的歷史, 不過 Subversion 實(shí)作了一個(gè) "虛擬" 的版本控管文件系統(tǒng), 能夠依時(shí)間跟蹤整個(gè)目錄的變動(dòng)诫硕。 目錄和文件都能進(jìn)行版本控制。
- 真實(shí)的版本歷史
- 自從CVS限制了文件的版本記錄刊侯,CVS并不支持那些可能發(fā)生在文件上章办,但會(huì)影響所在目錄內(nèi)容的操作,如同復(fù)制和重命名滨彻。除此之外藕届,在CVS里你不能用擁有同樣名字但是沒有繼承老版本歷史或者根本沒有關(guān)系的文件替換一個(gè)已經(jīng)納入系統(tǒng)的文件。在Subversion中亭饵,你可以增加(add)休偶、刪除(delete)、復(fù)制(copy)和重命名(rename)辜羊,無論是文件還是目錄踏兜。所有的新加的文件都從一個(gè)新的词顾、干凈的版本開始。
- 自動(dòng)提交
- 一個(gè)提交動(dòng)作碱妆,不是全部更新到了檔案庫中肉盹,就是完全不更新。這允許開發(fā)人員以邏輯區(qū)間建立并提交變動(dòng)山橄,以防止當(dāng)部分提交成功時(shí)出現(xiàn)的問題垮媒。
- 納入版本控管的元數(shù)據(jù)
- 每一個(gè)文件與目錄都附有一組屬性關(guān)鍵字并和屬性值相關(guān)聯(lián)。你可以創(chuàng)建, 并儲(chǔ)存任何你想要的Key/Value對航棱。 屬性是隨著時(shí)間來作版本控管的,就像文件內(nèi)容一樣睡雇。
- 選擇不同的網(wǎng)絡(luò)層
- Subversion 有抽象的檔案庫存取概念, 可以讓人很容易地實(shí)作新的網(wǎng)絡(luò)機(jī)制。 Subversion 可以作為一個(gè)擴(kuò)展模塊嵌入到Apache HTTP 服務(wù)器中饮醇。這個(gè)為Subversion提供了非常先進(jìn)的穩(wěn)定性和協(xié)同工作能力它抱,除此之外還提供了許多重要功能: 舉例來說, 有身份認(rèn)證, 授權(quán), 在線壓縮, 以及文件庫瀏覽等等。還有一個(gè)輕量級的獨(dú)立Subversion服務(wù)器观蓄, 使用的是自定義的通信協(xié)議, 可以很容易地通過 ssh 以 tunnel 方式使用。
- 一致的數(shù)據(jù)處理方式
- Subversion 使用二進(jìn)制差異算法來異表示文件的差異, 它對文字(人類可理解的)與二進(jìn)制文件(人類無法理解的) 兩類的文件都一視同仁祠墅。 這兩類的文件都同樣地以壓縮形式儲(chǔ)存在檔案庫中, 而且文件差異是以兩個(gè)方向在網(wǎng)絡(luò)上傳輸?shù)摹?/li>
- 有效的分支(branch)與標(biāo)簽(tag)
- 在分支與標(biāo)簽上的消耗并不必一定要與項(xiàng)目大小成正比。 Subversion 建立分支與標(biāo)簽的方法, 就只是復(fù)制該項(xiàng)目, 使用的方法就類似于硬連接(hard-link)。 所以這些操作只會(huì)花費(fèi)很小, 而且是固定的時(shí)間。
8.Hackability - Subversion沒有任何的歷史包袱; 它主要是一群共用的 C 程序庫, 具有定義完善的API巾乳。這使得 Subversion 便于維護(hù), 并且可被其它應(yīng)用程序與程序語言使用。
- 在分支與標(biāo)簽上的消耗并不必一定要與項(xiàng)目大小成正比。 Subversion 建立分支與標(biāo)簽的方法, 就只是復(fù)制該項(xiàng)目, 使用的方法就類似于硬連接(hard-link)。 所以這些操作只會(huì)花費(fèi)很小, 而且是固定的時(shí)間。
1.3 版本控制系統(tǒng)的生命周期
-
創(chuàng)建版本庫 (SVN啟動(dòng)模式 - 單庫 svnserve 方式鸟召、多庫svnserve方式)
版本庫相當(dāng)于一個(gè)集中的空間想鹰,用于存放開發(fā)者所有的工作成果。版本庫不僅能存放文件药版,還包括了每次修改的歷史辑舷,即每個(gè)文件的變動(dòng)歷史。
Create 操作是用來創(chuàng)建一個(gè)新的版本庫槽片。大多數(shù)情況下這個(gè)操作只會(huì)執(zhí)行一次何缓。當(dāng)你創(chuàng)建一個(gè)新的版本庫的時(shí)候肢础,你的版本控制系統(tǒng)會(huì)讓你提供一些信息來標(biāo)識版本庫,例如創(chuàng)建的位置和版本庫的名字碌廓。
-
檢出
Checkout 操作是用來從版本庫創(chuàng)建一個(gè)工作副本传轰。工作副本是開發(fā)者私人的工作空間,可以進(jìn)行內(nèi)容的修改谷婆,然后提交到版本庫中慨蛙。
-
更新
update 操作是用來更新版本庫的。這個(gè)操作將工作副本與版本庫進(jìn)行同步纪挎。由于版本庫是由整個(gè)團(tuán)隊(duì)共用的期贫,當(dāng)其他人提交了他們的改動(dòng)后,你的工作副本就會(huì)過期异袄。
讓我們假設(shè) Tom 和 Jerry 是一個(gè)項(xiàng)目的兩個(gè)開發(fā)者通砍。他們同時(shí)從版本庫中檢出了最新的版本并開始工作。此時(shí)烤蜕,工作副本是與版本庫完全同步的封孙。然后,Jerry 很高效的完成了他的工作并提交了更改到版本庫中讽营。此時(shí) Tom 的工作副本就過期了虎忌。更新操作將會(huì)從版本庫中拉取 Jerry 的最新改動(dòng)并將 Tom 的工作副本進(jìn)行更新。 -
執(zhí)行變更
當(dāng)檢出之后橱鹏,你就可以做很多操作來執(zhí)行變更膜蠢。編輯是最常用的操作。你可以編輯已存在的文件來蚀瘸,例如進(jìn)行文件的添加/刪除操作狡蝶。
你可以添加文件/目錄庶橱。但是這些添加的文件目錄不會(huì)立刻成為版本庫的一部分贮勃,而是被添加進(jìn)待變更列表中,直到執(zhí)行了 commit 操作后才會(huì)成為版本庫的一部分苏章。
同樣地你可以刪除文件/目錄寂嘉。刪除操作立刻將文件從工作副本中刪除掉,但該文件的實(shí)際刪除只是被添加到了待變更列表中枫绅,直到執(zhí)行了 commit 操作后才會(huì)真正刪除泉孩。
Rename 操作可以更改文件/目錄的名字。"移動(dòng)"操作用來將文件/目錄從一處移動(dòng)到版本庫中的另一處并淋。 -
復(fù)查變化
當(dāng)你檢出工作副本或者更新工作副本后寓搬,你的工作副本就跟版本庫完全同步了。但是當(dāng)你對工作副本進(jìn)行一些修改之后县耽,你的工作副本會(huì)比版本庫要新句喷。在 commit 操作之前復(fù)查下你的修改是一個(gè)很好的習(xí)慣镣典。
Status 操作列出了工作副本中所進(jìn)行的變動(dòng)。正如我們之前提到的唾琼,你對工作副本的任何改動(dòng)都會(huì)成為待變更列表的一部分兄春。Status 操作就是用來查看這個(gè)待變更列表。
Status 操作只是提供了一個(gè)變動(dòng)列表锡溯,但并不提供變動(dòng)的詳細(xì)信息赶舆。你可以用 diff 操作來查看這些變動(dòng)的詳細(xì)信息。 -
修復(fù)錯(cuò)誤
我們來假設(shè)你對工作副本做了許多修改祭饭,但是現(xiàn)在你不想要這些修改了芜茵,這時(shí)候 revert 操作將會(huì)幫助你。
Revert 操作重置了對工作副本的修改甜癞。它可以重置一個(gè)或多個(gè)文件/目錄夕晓。當(dāng)然它也可以重置整個(gè)工作副本。在這種情況下悠咱,revert 操作將會(huì)銷毀待變更列表并將工作副本恢復(fù)到原始狀態(tài)蒸辆。 -
解決沖突
合并的時(shí)候可能會(huì)發(fā)生沖突。Merge 操作會(huì)自動(dòng)處理可以安全合并的東西析既。其它的會(huì)被當(dāng)做沖突躬贡。例如,"hello.c" 文件在一個(gè)分支上被修改眼坏,在另一個(gè)分支上被刪除了拂玻。這種情況就需要人為處理。Resolve 操作就是用來幫助用戶找出沖突并告訴版本庫如何處理這些沖突宰译。
-
提交更改
Commit 操作是用來將更改從工作副本到版本庫檐蚜。這個(gè)操作會(huì)修改版本庫的內(nèi)容,其它開發(fā)者可以通過更新他們的工作副本來查看這些修改沿侈。
在提交之前闯第,你必須將文件/目錄添加到待變更列表中。列表中記錄了將會(huì)被提交的改動(dòng)缀拭。當(dāng)提交的時(shí)候咳短,我們通常會(huì)提供一個(gè)注釋來說明為什么會(huì)進(jìn)行這些改動(dòng)。這個(gè)注釋也會(huì)成為版本庫歷史記錄的一部分蛛淋。Commit 是一個(gè)原子操作咙好,也就是說要么完全提交成功,要么失敗回滾褐荷。用戶不會(huì)看到成功提交一半的情況勾效。
2 SVN 命令實(shí)戰(zhàn)
這里展示 常用的命令,對于命令一些細(xì)節(jié)。需要結(jié)合 幫助 來查看
查看 svn 命令幫助:svn help
具體命令的幫助:svn help [COMMAND]
2.1 SVN 啟動(dòng)模式
首先,在服務(wù)端進(jìn)行SVN版本庫的相關(guān)配置
手動(dòng)新建版本庫目錄
mkdir /home/svndata
利用svn命令創(chuàng)建版本庫
svnadmin create /home/svndata/project1
使用命令svnserve啟動(dòng)服務(wù)
svnserve -d -r 目錄 --listen-port 端口號
-r: 配置方式?jīng)Q定了版本庫訪問方式层宫。配置方式的不同绘迁,SVN啟動(dòng)就有兩種不同的訪問方式(單庫 svnserve 方式、多庫svnserve方式)
--listen-port: 指定SVN監(jiān)聽端口卒密,不加此參數(shù)缀台,SVN默認(rèn)監(jiān)聽3690
-r直接指定到版本庫(單庫 svnserve 方式)
svnserve -d -r /home/svndata/project1
在這種情況下,一個(gè)svnserve只能為一個(gè)版本庫工作哮奇。
authz配置文件中對版本庫權(quán)限的配置應(yīng)這樣寫:
[groups]
admin=user1
dev=user2
[/]
@admin=rw
user2=r
此時(shí)訪問的路徑
svn://192.168.0.1/
就訪問到 project1 的版本庫 (單一版本)
指定到版本庫的上級目錄(多庫svnserve方式)
svnserve -d -r /home/svndata
這種情況膛腐,一個(gè)svnserve可以為多個(gè)版本庫工作
authz配置文件中對版本庫權(quán)限的配置應(yīng)這樣寫:
[groups]
/home/svndata
admin=user1
dev=user2
[project1:/]
@admin=rw
user2=r
[project2:/]
@admin=rw
user2=r
如果此時(shí)你還用[/],則表示所有庫的根目錄鼎俘,同理哲身,[/project1]表示所有庫的根目錄下的 project1 目錄。
此時(shí)訪問的路徑
svn://192.168.0.1/project1
才是訪問到 project1 的版本庫
2.2 svnadmin create 創(chuàng)建版本庫
格式:svnadmin create /home/svndata/project1
此時(shí)可以查看下 創(chuàng)建的資源庫目錄路徑
# ll /home/svndata/project1
總用量 24
drwxr-xr-x 2 root root 4096 7月 16 23:06 conf
drwxr-sr-x 6 root root 4096 7月 16 23:06 db
-r--r--r-- 1 root root 2 7月 16 23:06 format
drwxr-xr-x 2 root root 4096 7月 16 23:06 hooks
drwxr-xr-x 2 root root 4096 7月 16 23:06 locks
-rw-r--r-- 1 root root 229 7月 16 23:06 README.txt
進(jìn)入 /home/svndata/project1/conf 目錄 修改默認(rèn)配置文件配置贸伐,包括svnserve.conf勘天、passwd、authz 配置相關(guān)用戶和權(quán)限捉邢。
svn服務(wù)配置文件svnserve.conf
svn服務(wù)配置文件為版本庫目錄中的文件conf/svnserve.conf脯丝。該文件僅由一個(gè)[general]配置段組成。
[general]
anon-access = none
auth-access = write
password-db = /home/svndata/conf/passwd
authz-db = /home/svndata/conf/authz
realm = /home/svn
- anon-access: 控制非鑒權(quán)用戶訪問版本庫的權(quán)限伏伐。取值范圍為"write"宠进、"read"和"none"。 即"write"為可讀可寫藐翎,"read"為只讀材蹬,"none"表示無訪問權(quán)限。 缺省值:read
- auth-access: 控制鑒權(quán)用戶訪問版本庫的權(quán)限吝镣。取值范圍為"write"堤器、"read"和"none"。 即"write"為可讀可寫末贾,"read"為只讀闸溃,"none"表示無訪問權(quán)限。 缺省值:write
- authz-db: 指定權(quán)限配置文件名未舟,通過該文件可以實(shí)現(xiàn)以路徑為基礎(chǔ)的訪問控制圈暗。 除非指定絕對路徑掂为,否則文件位置為相對conf目錄的相對路徑裕膀。 缺省值:authz
- realm: 指定版本庫的認(rèn)證域,即在登錄時(shí)提示的認(rèn)證域名稱勇哗。若兩個(gè)版本庫的 認(rèn)證域相同昼扛,建議使用相同的用戶名口令數(shù)據(jù)文件。 缺省值:一個(gè)UUID(Universal Unique IDentifier,全局唯一標(biāo)示)抄谐。
用戶名口令文件passwd
用戶名口令由 svnserve.conf 的配置項(xiàng) password-db 指定渺鹦,缺省為 conf 目錄中的 passwd。該文件僅由一個(gè)[users]配置段組成蛹含。
[users]配置段的配置行格式如下:<用戶名> = <口令>
例如:
[users]
admin = admin
thinker = 123456
權(quán)限配置文件毅厚,由svnserve.conf的配置項(xiàng)authz-db指定,缺省為conf目錄中的authz浦箱。該配置文件由一個(gè)[groups]配置段和若干個(gè)版本庫路徑權(quán)限段組成吸耿。
[groups]配置段中配置行格式如下:<用戶組> = <用戶列表>
版本庫路徑權(quán)限段的段名格式如下:[<版本庫名>:<路徑>]
例如:
[groups]
g_admin = admin,thinker
[project1:/]
@g_admin = rw
* =
[project2:/home/thinker]
thinker= rw
* = r
2.3 svn checkout 檢出操作
Checkout 操作是用來從版本庫創(chuàng)建一個(gè)工作副本。工作副本是開發(fā)者私人的工作空間酷窥,可以進(jìn)行內(nèi)容的修改咽安,然后提交到版本庫中。
命令:svn checkout {REMOTE_URL} [本地路徑] [--username 用戶名] [--password 密碼]
- checkout:可以用 co 簡寫表示
- {REMOTE_URL}:http://路徑(目錄或文件的全路徑) 或 svn://路徑(目錄或文件的全路徑)
- 如果不帶 --password 參數(shù)傳輸密碼的話蓬推,會(huì)提示輸入密碼妆棒,建議不要用明文的--password 選項(xiàng)。
例子:
svn checkout svn://120.77.47.95/project1 ./project1 --username svn --password password
svn checkout http://localhost/test/testapp --username svn -password password
2.4 svn export 導(dǎo)出
導(dǎo)出一個(gè)干凈的不帶.svn文件夾的目錄樹
命令:svn export [-r 版本號] {REMOTE_URL} [本地路徑] [--username 用戶名] [--password 密碼]
- [-r 版本號] 如果沒有指定版本沸伏,則導(dǎo)出最新版本
- {REMOTE_URL}:http://路徑(目錄或文件的全路徑) 或 svn://路徑(目錄或文件的全路徑) 或 本地檢出的(即帶有.svn文件夾的)目錄全路徑
例子:
svn export svn://120.77.47.95/project1 ./project1 --username svn --password password
svn export svn://localhost/test/testapp --username wzhnsc
svn export ./project1 ./project3
2.5 svn info 查看信息
命令:svn info [FILENAME]
# svn info
Path: .
Working Copy Root Path: /svnTest/project1
URL: svn://120.77.47.95/project1
Relative URL: ^/
Repository Root: svn://120.77.47.95/project1
Repository UUID: 6326bcb1-f436-4566-bf8c-79cbd8bbe825
Revision: 18
Node Kind: directory
Schedule: normal
Last Changed Author: root
Last Changed Rev: 18
Last Changed Date: 2019-07-18 23:24:35 +0800 (四, 18 7 2019)
2.6 svn add 添加文件
添加文件后糕珊,進(jìn)行 commit 提交
命令:svn add {FILE} # 添加文件到本地版本庫
例子:
svn add 1.txt # 添加test.php
svn add *.php # 添加當(dāng)前目錄下所有的php文件
svn add * # 添加所有文件(已經(jīng)添加過的 會(huì)有 warning 提示)
2.7 svn commit 提交
命令:svn commit -m {MESSAGE} [-N] [--no-unlock] 文件名
- commit:可以簡寫為 ci
- MESSAGE:提交注釋
例子:
svn commit -m “提交當(dāng)前目錄下的全部在版本控制下的文件“ * <- 注意這個(gè)*表示全部文件
svn commit -m “提交我的測試用test.php“ test.php
svn commit -m “提交我的測試用test.php“ -N --no-unlock test.php <- 保持鎖就用–no-unlock開關(guān)
svn ci -m “提交當(dāng)前目錄下的全部在版本控制下的文件“ * <- 注意這個(gè)*表示全部文件
svn ci -m “提交我的測試用test.php“ test.php
svn ci -m “提交我的測試用test.php“ -N --no-unlock test.php <- 保持鎖就用–no-unlock開關(guān)
2.8 svn update更新文件
命令:svn update [-r 修正版本] [文件名]
例子:
svn update <- 后面沒有目錄,默認(rèn)將當(dāng)前目錄以及子目錄下的所有文件都更新到最新版本
svn update -r 200 test.cpp <- 將版本庫中的文件 test.cpp 還原到修正版本(revision)200
svn update test.php <- 更新與版本庫同步毅糟。
提交的時(shí)候提示過期沖突放接,需要先 update 修改文件,
然后清除svn resolved留特,最后再提交commit纠脾。
2.9 svn status 目錄文件狀態(tài)
命令:svn status
例子:
# svn status
M 1.txt
? 2.txt
A 3.txt
各字符代表含義:
字符 | 狀態(tài) | 說明 |
---|---|---|
A | 添加 | 與上一版相比增加的文件 |
C | 沖突 | 該文件沖突 |
D | 刪除 | 該文件已從倉庫刪除,以后SVN不再跟蹤版本 |
M | 修改 | 該文件被修改過 |
S | 處于其他分支 | 當(dāng)前分支的子路徑處于其他分支 |
? | 未納入版本管理 | 通常是新增文件蜕青,SVN還沒跟蹤該文件的版本苟蹈。可以使用svn add把文件加入SVN右核,此時(shí)再運(yùn)行svn status時(shí)慧脱,文件的狀態(tài)就顯示為A |
! | 文件缺失 | SVN找不到該文件。一般出現(xiàn)在沒有使用SVN命令刪除文件的情況贺喝。當(dāng)需要從倉庫刪除某文件時(shí)菱鸥,應(yīng)該使用svn delete,這樣文件的狀態(tài)就變?yōu)镈躏鱼,提交以后該文件的版本就不再被跟蹤 |
執(zhí)行提交后氮采,也會(huì)對應(yīng)信息提示(Adding 代表 添加,Sending 代表 更新)染苛。并且修訂版本號自動(dòng)增加了1
Adding 2.txt
Sending 1.txt
Transmitting file data .done
Committing transaction...
Committed revision 3.
2.10 svn delete 刪除文件
刪除后注意 用 commit 提交
命令:
svn delete REMOTE_URL -m MESSAGE
svn delete 文件名
- delete鹊漠,可以簡寫:del, remove, rm
svn delete svn://localhost/testapp/test.php -m “刪除測試文件test.php”
推薦如下操作:
svn delete test.php
2.11 svn lock/unlock 加鎖/解鎖
命令
svn lock -m “加鎖備注信息文本“ [--force] 文件名
svn unlock 文件名
例子:
svn lock -m “鎖信測試用test.php文件“ test.php
svn unlock test.php
2.12 svn diff 比較差異
命令:svn diff -r [ 修正版本號m [ | 修正版本號n ]] [DIR|FILENAME]
例子:
svn diff # 什么都不加,會(huì)堅(jiān)持本地代碼和緩存在本地.svn目錄下的信息的不同;信息太多,沒啥用處躯概。
svn diff -r 3 # 比較你的本地代碼和版本號為3的所有文件的不同登钥。
svn diff -r 3 text.c # 比較你的本地代碼和版本號為3的text.c文件的不同。
svn diff -r 5:6 # 比較版本5和版本6之間所有文件的不同娶靡。
svn diff -r 5:6 text.c # 比較版本5和版本6之間的text.c文件的變化牧牢。
svn diff -c 6 test.c # 比較版本5和版本6之間的text.c文件的變化。
實(shí)例:
- 檢查本地修改
- 比較工作拷貝與版本庫
- 比較版本庫與版本庫
- 如果用 svn diff姿锭,不帶任何參數(shù)结执,它將會(huì)比較你的工作文件與緩存在 .svn 的"原始"拷貝。
# svn diff
Index: 1.txt
===================================================================
--- 1.txt (revision 7)
+++ 1.txt (working copy)
@@ -1,4 +1,4 @@
-1111
+121111
2222
3333
4444
- 比較指定文件(下面的 1.txt 可以替換成 ./) 工作拷貝和版本庫艾凯。
# svn diff -r 3 1.txt
Index: 1.txt
===================================================================
--- 1.txt (revision 3)
+++ 1.txt (working copy)
@@ -1,4 +1,4 @@
-1111
+121111
2222
3333
4444
- 比較版本庫與版本庫
-r(revision) 傳遞兩個(gè)通過冒號分開的版本號献幔,這兩個(gè)版本會(huì)進(jìn)行比較
svn diff -r 1:3 1.txt
Index: 1.txt
===================================================================
--- 1.txt (revision 1)
+++ 1.txt (revision 3)
@@ -1,5 +1,5 @@
-111
-222
-333
-444
-555
+1111
+2222
+3333
+4444
+5555
2.13 svn log 查看提交日志
命令:svn log [DIR|FILANAME] [-r NUM|NUM] [-v] [-l N -v]
- -r NUM|NUM:查看特定版本之間的信息
例子:
svn log # 什么都不加會(huì)顯示所有版本commit的日志信息:版本、作者趾诗、日期蜡感、comment。
svn log -r 4:20 # 只看版本4到版本20的日志信息恃泪,順序顯示郑兴。
svn log -r 20:5 # 顯示版本20到4之間的日志信息,逆序顯示贝乎。
svn log test.c # 查看文件test.c的日志修改信息情连。
svn log -r 8 -v # 顯示版本8的詳細(xì)修改日志,包括修改的所有文件列表信息览效。
svn log -r 8 -v -q # 顯示版本8的詳細(xì)提交日志却舀,不包括comment。
svn log -v -r 88:866 # 顯示從版本88到版本866之間锤灿,當(dāng)前代碼目錄下所有變更的詳細(xì)信息 挽拔。
svn log -v dir # 查看目錄的日志修改信息,需要加v。
svn log http://foo.com/svn/trunk/code/ # 顯示代碼目錄的日志信息但校。
實(shí)例:
# svn log -r 3:4
------------------------------------------------------------------------
r3 | root | 2019-07-18 00:50:00 +0800 (四, 18 7 2019) | 1 line
update 2.txt
------------------------------------------------------------------------
r4 | root | 2019-07-18 00:51:51 +0800 (四, 18 7 2019) | 1 line
update 3.txt
------------------------------------------------------------------------
- DIR|FILANAME:查看特定文件(1.txt) 或 路徑(./) 文件
# svn log 1.txt
------------------------------------------------------------------------
r7 | root | 2019-07-18 10:56:14 +0800 (四, 18 7 2019) | 1 line
update 3.txt
------------------------------------------------------------------------
r2 | root | 2019-07-18 00:35:50 +0800 (四, 18 7 2019) | 1 line
update 1
------------------------------------------------------------------------
- -v:可以查看目錄信息
- -l N -v:顯示限定N條記錄的目錄信息
# svn log -l 2 -v
------------------------------------------------------------------------
r7 | root | 2019-07-18 10:56:14 +0800 (四, 18 7 2019) | 1 line
Changed paths:
A /1.txt (from /1.txt:4)
A /2.txt (from /2.txt:4)
A /3.txt (from /3.txt:4)
update 3.txt
------------------------------------------------------------------------
r6 | root | 2019-07-18 10:55:42 +0800 (四, 18 7 2019) | 1 line
Changed paths:
D /1.txt
update 3.txt
------------------------------------------------------------------------
2.14 svn cat 查看過去版本
只是檢查一個(gè)過去版本螃诅,不希望查看他們的區(qū)別,可使用svn cat
命令:svn cat -r 版本號 rule.txt
例子
svn cat -r 4 test.c # 查看版本4中的文件test.c的內(nèi)容,不進(jìn)行比較状囱。
2.15 svn list 查看目錄文件
可以在不下載文件到本地目錄的情況下來察看目錄中的文件:
命令:svn list {REMOTE_URL}
例子:
svn list http://svn.test.com/svn # 查看目錄中的文件术裸。
svn list -v http://svn.test.com/svn # 查看詳細(xì)的目錄的信息(修訂人,版本號,文件大小等)。
svn list [-v] # 查看當(dāng)前當(dāng)前工作拷貝的版本庫URL亭枷。
# svn list http://192.168.0.1/runoob01
README
branches/
clients/
tags/
2.16 svn mkdir 創(chuàng)建納入版本控制下的新目錄
命令
svn mkdir 目錄名
svn mkdir -m "新增目錄備注文本" http://目錄全路徑
例子:
svn mkdir newdir
svn mkdir -m "Making a new dir." svn://localhost/test/newdir
注意:
添加完子目錄后袭艺,一定要回到根目錄更新一下(創(chuàng)建納入版本控制下的新目錄),不然在該目錄下提交文件會(huì)提示“提交失敗”
-
如果手工在checkout出來的目錄里創(chuàng)建了一個(gè)新文件夾newsubdir奶栖,再用svn mkdir newsubdir命令后匹表,SVN會(huì)提示:
svn: 嘗試用 “svn add”或 “svn add --non-recursive”代替? svn: 無法創(chuàng)建目錄“hello”: 文件已經(jīng)存在
此時(shí)宣鄙,用如下命令解決:svn add --non-recursive newsubdir
在進(jìn)入這個(gè)newsubdir文件夾袍镀,用ls -a查看它下面的全部目錄與文件,會(huì)發(fā)現(xiàn)多了:.svn目錄
再用 svn mkdir -m "添hello功能模塊文件" svn://localhost/test/newdir/newsubdir 命令冻晤,SVN提示:
svn: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1',
path '/newdir/newsubdir '
2.17 SVN 恢復(fù)本地修改
放棄對文件修改
命令:svn revert 文件名
或 svn revert -R 目錄名
例子:
svn revert foo.c <- 丟棄對一個(gè)文件的修改
svn revert --recursive . <-恢復(fù)一整個(gè)目錄的文件苇羡,. 為當(dāng)前目錄
2.18 SVN 版本回退
命令:svn merge -r [當(dāng)前版本]:[要回滾的版本] 目錄名
如:現(xiàn)在是版本 22,我們要撤銷回之前的版本鼻弧,比如版本 21设江。
svn merge -r 22:21 readme
2.19 svn resolve/resolved 解決沖突
命令:
svn resolved [本地目錄全路徑] # 讓工作拷貝知道已經(jīng)處理了沖突(刪除沖突產(chǎn)生的相關(guān)文件)
svn resolve --accept [base | working | mine-conflict | theirs-conflict | mine-full | theirs-full] [conflicting file]
參數(shù) | 說明 |
---|---|
base | 將[your_file].merge-left.[version]做為最終結(jié)果 |
working | 把[your_file]解決沖突后的結(jié)果做為最終結(jié)果 |
mine-conflict | 將[your_file].working做為最終結(jié)果 |
theirs-conflict | 將[your_file].merge-right.[version]做為最終結(jié)果 |
mine-full | 將所有[your_file].working做為最終結(jié)果 |
theirs-full | 將所有[your_file].merge-right.[version]做為最終結(jié)果 |
例子:
$ svn update
C foo.c
Updated to revision 31.
如果你在更新時(shí)得到?jīng)_突,你的工作拷貝會(huì)產(chǎn)生三個(gè)新的文件:
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
當(dāng)你解決了foo.c的沖突攘轩,并且準(zhǔn)備提交叉存,運(yùn)行 svn resolved 讓你的工作拷貝知道你已經(jīng)完成了所有事情。
你可以僅僅刪除沖突的文件并且提交度帮,但是 svn resolved 除了刪除沖突文件歼捏,還修正了一些記錄在工作拷貝管理區(qū)域的記錄數(shù)據(jù),所以我們推薦你使用這個(gè)命令笨篷。
2.20 svn switch 把工作拷貝更新到別的URL
命令:svn switch {REMOTE_URL}
例子:
svn switch http://localhost/test/456 . # (原為123的分支)當(dāng)前所在目錄分支到localhost/test/456
2.21 svn copy 新建分支
copy 分支瞳秽,有兩種用法,一種用戶創(chuàng)建 標(biāo)簽率翅。一種用于 創(chuàng)建分支练俐,結(jié)合 switch 使用。
命令:
svn copy {SRC_LOCAL_PATH} {TARGET_LOCAL_PATH} # 標(biāo)簽用法:創(chuàng)建標(biāo)簽冕臭,只是復(fù)制文件腺晾,到 目標(biāo)文件
svn copy {SRC_REMOTE_URL} {TARGET_REMOTE_URL} -m {MESSAGE} # 分支用法:創(chuàng)建 分支到同一個(gè)倉庫中其他 目錄路徑下,配合 switch 使用(注意要在 SRC_REMOTE_URL 使用 switch)
例子:
// 創(chuàng)建標(biāo)簽 (將主干庫 放到 release (提交創(chuàng)建好目錄并提交) 完整版本記錄)
# svn copy trunk/ release/project-v1.0
A release/project-v1.0
# svn commit -m '創(chuàng)建 project-v1.0 版本'
2.22 svn merge 合并分支
命令:svn merge branchA branchB
作用:把對branchA的修改合并到分支branchB
個(gè)性化定制 (只是簡單例子)
svn配置文件: ~/.subversion/config
修改~/.subversion/config辜贵,找到如下配置行:
# diff-cmd = diff_program (diff, gdiff, etc.)
將上面那個(gè)腳本的路徑添加進(jìn)去就行丘喻,修改為
diff-cmd = /usr/local/bin/diffwrap.sh #絕對路徑
這樣svn diff命令就會(huì)默認(rèn)使用vimdiff比較文件。
diffwrap.sh文件
#! /bin/bash
# for svn diff: 修改~/.subversion/config念颈,找到如下配置行:
# diff-cmd = diff_program (diff, gdiff, etc.)
# diff-cmd = ~/bin/diffwrap.sh
# 參數(shù)大于5時(shí)泉粉,去掉前5個(gè)參數(shù);參數(shù)小于5榴芳,失敗嗡靡,什么也不做
shift 5
# 使用vimdiff比較
vimdiff "$@"
3. 開發(fā)實(shí)戰(zhàn)
實(shí)際開發(fā)一般通用流程是:
-
獲取代碼(更新代碼)
->修改代碼
->更新代碼,并解決沖突
->提交更新
-
獲取代碼(更新代碼)
->新建分支
->查看分支
->提交分支(解決沖突)
->合并分支
->刪除分支
3.1 解決沖突
假設(shè)當(dāng)前版本1窟感,有一個(gè)文件1.txt
如下:
line 1
line 2
A用戶進(jìn)行修改并且提交
line 1
line 2
line 3
此時(shí) B 用戶讨彼,沒有進(jìn)行 update,也進(jìn)行修改柿祈,再提交
line 1
line 2
line 4 modify
提交哈误,提示 commit(提交) 失敗哩至,此時(shí)執(zhí)行 update(更新)
# svn commit -m 'commit r3'
Sending 1.txt
Transmitting file data .done
Committing transaction...
svn: E160028: Commit failed (details follow):
svn: E160028: 文件 “/1.txt” 已經(jīng)過時(shí)
------------------------------------
# svn update
Updating '.':
C 1.txt
Updated to revision 2.
Summary of conflicts:
Text conflicts: 1
Merge conflict discovered in file '1.txt'.
Select: (p) Postpone, # 標(biāo)記沖突,暫不處理
(df) Show diff, # 顯示所有沖突
(e) Edit file, # 編輯沖突 (需要對應(yīng) 編輯器 用此選項(xiàng)才有用)
(m) Merge, # 合并
(mc) mine-conflict, # 沖突以本地文件為準(zhǔn)
(tf) theirs-conflict, # 沖突以遠(yuǎn)程倉庫為準(zhǔn)
(s) Show all options: # 顯示所有選項(xiàng)
- p (postpone) 標(biāo)記沖突蜜自,暫不處理
如果沖突很嚴(yán)重菩貌,需要和提交者討論解決,可以輸入p標(biāo)記重荠,此時(shí)輸入svn status顯示:
svn status
C 1.txt
? 1.txt.mine
? 1.txt.r1
? 1.txt.r2
Summary of conflicts:
Text conflicts: 1
文件 | 說明 |
---|---|
[your_file] | 所有沖突標(biāo)記在該文件 |
[your_file].working | 當(dāng)前工作副本 |
[your_file].merge-left.[version] | 產(chǎn)生沖突前基礎(chǔ)版本 |
[your_file].merge-right.[version] | 倉庫里的最新版本 |
用一下命令解決沖突
命令:svn resolve --accept [base | working | mine-conflict | theirs-conflict | mine-full | theirs-full] [conflicting file]
解決沖突后箭阶,文件狀態(tài)變?yōu)镸,這時(shí)再向倉庫提交代碼即可戈鲁。
- df (Show diff) 顯示所有沖突
選擇 df (顯示沖突) (顯示3段仇参,上面是 自己的,中間是 當(dāng)前本地版本庫婆殿,下面是 遠(yuǎn)程版本)
--- 1.txt.r2 - THEIRS
+++ 1.txt - MERGED
@@ -1,5 +1,19 @@
+<<<<<<< .mine
+11
+22
+33
+||||||| .r1
+111
+222
+333
+=======
1111
2222
3333
+>>>>>>> .r2
- m (Merge) 合并沖突诈乒,會(huì)提示如下:
Merging '1.txt'.
Conflicting section found during merge:
(1) their version (at line 4) |(2) your version (at line 4)
------------------------------------------------------------------------------+------------------------------------------------------------------------------
line 4 |line 4 merge
------------------------------------------------------------------------------+------------------------------------------------------------------------------
Select: (1) use their version, # 使用 遠(yuǎn)端 的版本
(2) use your version, # 使用 你當(dāng)前 的版本
(12) their version first, then yours, # 遠(yuǎn)端版本 放前面,你當(dāng)前版本代碼 放后面
(21) your version first, then theirs, # 你當(dāng)前版本代碼 放前面婆芦,遠(yuǎn)端版本 放后面
(e1) edit their version and use the result, # 編輯遠(yuǎn)端版本抓谴,然后使用其結(jié)果 (需要對應(yīng)編輯器支持)
(e2) edit your version and use the result, # 編輯你當(dāng)前版本,然后使用其結(jié)果 (需要對應(yīng)編輯器支持)
(eb) edit both versions and use the result, # 編輯2個(gè)版本寞缝,然后使用其結(jié)果 (需要對應(yīng)編輯器支持)
(p) postpone this conflicting section leaving conflict markers, # 推遲這個(gè)沖突的部分留下沖突標(biāo)記
(a) abort file merge and return to main menu: # 中止文件合并并返回主菜單
由于沒有對應(yīng)編輯器支持癌压,直接編輯,最后都會(huì)走到 p荆陆,推遲沖突滩届,通過編輯文件 or resolve命令來解決
查看當(dāng)前文件
- <<<< .mine 到 ||||| .r2 就是你當(dāng)前版本的代碼
- ======= 到 >>>>>>> .r3 就是遠(yuǎn)端當(dāng)前版本的代碼
line 1
line 2
line 3
<<<<<<< .mine
line 4 merge
||||||| .r2
=======
line 4
>>>>>>> .r3
可以通過resolve 修復(fù),也可以通過 直接修改文件被啼,刪除 其他沖突標(biāo)記文件來解決
3.2 分支開發(fā)
// 1. 創(chuàng)建分支 并提交 (此時(shí)可以看到 對應(yīng)目錄有該分支帜消,記得 執(zhí)行下 update 更新當(dāng)前版本號)
# svn copy svn://120.77.47.95/project1/trunk/ svn://120.77.47.95/project1/branch/dev -m '創(chuàng)建DEV分支'
Committing transaction...
Committed revision 2.
# svn update
// 2. 切換到 DEV 分支進(jìn)行開發(fā),注意要進(jìn)入到 trunk 目錄進(jìn)行 switch 操作
# cd trunk
# svn switch svn://120.77.47.95/project1/branch/dev
At revision 22.
// 3. 假設(shè)修改文件浓体,更新 到 DEV 分支
# vim 1.txt
# svn commit -m '添加DEV2'
Sending 1.txt
Transmitting file data .done
Committing transaction...
Committed revision 23.
// 4. 切回 主干分支
# svn switch svn://120.77.47.95/project1/trunk/
U 1.txt
Updated to revision 23.
// 5. 合并 DEV 分支文件 到 主干 (如果有沖突泡挺,則解決沖突),然后提交
# svn merge svn://120.77.47.95/project1/branch/dev
--- Merging r22 through r23 into '.':
U 1.txt
--- Recording mergeinfo for merge of r22 through r23 into '.':
U .
# svn commit -m '添加DEV2'
Sending .
Sending 1.txt
Transmitting file data .done
Committing transaction...
Committed revision 24.
// 6. 刪除 開發(fā)的 分支
# svn delete svn://120.77.47.95/project1/branch/dev -m '刪除 DEV 分支'
Committing transaction...
Committed revision 25.