參考資料:
《使用Subersion進資料列版本設定》
針對 Subversion 1.1
/***20090510*****/
帶著問題學習:
1,什麼是SVN?
2,大致的原理?
3,據我所知的命令有:
1)svn checkout
2)svn update
3)svn commit
但是發生衝突的時候commit會把自己的修改擦掉嗎?
剛開始工作的時候如果沒有使用svn update那麼如果之後使用得了commit會怎麼樣?
如果之後才使用svn update那麼會怎麼樣?自己的修改還存在嗎?
4,我只想知道的功能:
0)怎樣建立最初的svn工作環境?
1)匯出伺服器的工作目錄到本機?
2)補救伺服器的修改以便與原生工作拷貝同步?
3)提交自己的修改到伺服器,並且添加一些說明性的資訊?
4)更新原生拷貝到伺服器中一個特定的版本?
5) 查看伺服器上所有可用的版本的資訊?
6)如何處理衝突?
7)從伺服器撿出一個指定的版本到獨立的一個工作拷貝?
8)在本地工作目錄增加、刪除了一個檔案或者目錄,如何讓它與伺服器的也同步?
9)一般程式員利用svn工作的日常步驟到底是怎麼樣的?
10)怎樣變更檔的名字以及移動工作目錄?
5,我好奇的功能:
1)svn checkout
2)svn update
3)svn copy
4)svn add
5)svn delete
6)svn commit
7)svn cat
============================
===============
===============
前面都是廢話,這裡是正題,慢慢地更新吧。
開始都是最簡單的,往後隨著應用以及興趣,會更新。
===============
===============
============================
-----------------------------------------
一,些“術語”:
1,工作拷貝:
一個工作拷貝就是你本地機器的一個普通的目錄,儲存一些檔案,你可以任意的編輯、編譯它們,你的工作拷貝是你的私人工作區,Subversion不會自動把你的修改與其他人的合并,也不會把你的修改展示給別人。當你確定要“發布”自己的修改的時候,SVN會提供相應命令,這樣你才能把你的工作和別人的工作合并,並使別人看到你的修改。
通常你的工作拷貝的每一個檔案夾裡有一個以".svn"為名的檔案夾,它用來協助Subversion來識別哪個檔案作個修改,以及哪個檔案已經到期等等。
------------------------------------------
二,基本命令
*擷取協助:
$svn help
*得到一個工作拷貝:
$svn checkout htttp://svn.example.com/repos/calc
這樣你就有了一個/calc的個人拷貝,它是從:http://svn.example.com/repos/calc提取出來的。
*得到一個工作拷貝並放到你的新目錄中:
$svn checkout http://svn.example.com/repos/calc subv
這樣工作目錄(拷貝)calc將放到你的新目錄(subv)中。
SVN可以有多種不同方式訪問的URL形式:
file:/// 用來訪問本地的
http:// 用來訪問SVN的Apache的WebDAV協議
https:// 同上,不過用ssl加密
svn:// 用來訪問SVN自訂的協議的的
svn+ssh:// 同上,不過用ssh封裝
**提交你的修改:
*直接提交某個檔案的修改:
$svn commit button.c
這樣,你就會把自己對button.c的修改提交到伺服器上去,提交後會使版本庫的版本號碼加1,以後可通過指定號碼恢複(其他人的工作拷貝需要他們自己請求更新,才會把伺服器上新版本更新到本地,看到你的修改,可能出現的覆蓋問題後面有解決方案).
*直接把所有修改的資訊提交到版本庫:
$svn commit
由於既沒有--message(或-m),也沒有--file來描述修改的資訊,所以SVN會啟用一個你喜歡的編輯器來編輯日誌描述訊息。如果寫描述時想要取消提交,那麼直接關閉編輯器,不要儲存,然後在提示中選a即abort,(如果選的是c即continue,那麼應該就會提交沒有描述資訊的修改);如果你儲存了日誌,那麼只需要簡單刪掉所有文本,再次儲存。
*提交時增加描述修改的日誌資訊:
$svn commit --message "add some infomation"
這裡,--message可以簡化為-m,後面接的是描述資訊的字串。如果描述資訊很短,就可以這樣直接再命令列中指定。如果資訊多,就需要指定檔案,見後面。
*提交時指定描述修改的記錄檔:
$svn commit --file logmsg
這裡,利用了--file,後面接的就是相應的記錄檔。
**
*更新自己的工作拷貝:
$svn update
這樣,將會把你的工作拷貝更新為伺服器上最新的版本,看到其他人的修改。不用你自己指定,SVN會識別那些檔案需要更新(可能出現的覆蓋問題後面有解決方案)。該命令的輸出資訊將告訴你哪些檔案被做了哪些修改到你的工作拷貝。
SVN對update和commit可能產生問題的解決:
1)若在工作拷貝裡沒做修改,且伺服器版本庫在工作拷貝版本之後也沒被提交過其他修改;那麼svn commit不做任何事,svn update不做任何事。
2)若在工作拷貝裡做過修改,但伺服器版本庫在修改前工作拷貝的版本後沒被提交過其他修改;那麼svn commit會成功地提交(補救伺服器版本庫),svn update不做任何事。
3)若在工作拷貝裡沒做修改,但伺服器版本庫在工作拷貝版本之後被提交過其他修改;那麼svn commit不做任何事,svn update會把你的工作拷貝版本更新為版本庫中最新的。
4)若工作拷貝裡做過修改,且伺服器版本庫在修改前工作拷貝的版本後被提交過其他修改;那麼svn commit首先會失敗並要求update,svn update會合并版本庫和本地的修改,如果有衝突會詢問使用者去解決(,之後就繼續了??)。
*檢查自己的修改:
$svn status
這個命令不會和版本庫通訊,其顯示的資訊是告訴你你的當前工作拷貝將對伺服器上的版本庫作怎樣的修改,在當前工作拷貝的頂級目錄運行,預設將遞迴檢查子目錄上所有的檔案,該命令和update不一樣,但有些共通之處(指出了變化)。
*檢查自己對某個檔案的修改:
$svn status stuff/fish.c
和上面的命令一樣,不過指定了一個特定的檔案項,那麼就僅顯示該檔案項的資訊。
**關於對工作拷貝目錄結構的修改:
你可以使用任何你喜歡的編輯工具編輯檔案,但是你不可以在修改目錄結構時不通知Subversion。
*為版本庫添加一個新檔案:
$touch foo
$svn add foo
這裡,foo是待添加的檔案。當然需要commit才會使版本庫目錄結構改變。先用普通linux命令在目錄中建立了一個foo檔案,然後通知svn要添加這個檔案。如果foo是一個目錄,那麼svn預設會將foo目錄下的所有檔案也遞迴地添加進去(若僅添加目錄不遞迴添加下面的檔案需要使用-N參數)。
*在版本庫刪除一個檔案:
$svn delete foo
這裡,foo是待刪除的檔案。當然需要commit才會使版本庫目錄結構改變,不需要非得用linux普通命令將foo檔案刪除再進行,只用svn delete foo,意思是版本庫中“邏輯上”把這個檔案刪除了,版本庫中沒有了這檔案,而實際在普通的檔案系統中還有這個檔案,可以重新再添加進去。
*在版本庫拷貝一個檔案:
$svn copy foo bar
這裡,建立一個foo的拷貝檔案:bar。當然需要commit才會使版本庫目錄結構改變。需要利用普通linux命令cp事先建立一個bar檔案嗎???
*在版本庫移動一個檔案:
$svn move foo bar
這裡的例子相當於把檔案foo重新命名為bar了。當然需要commit才會使版本庫目錄結構改變。需要事先利用普通linux命令mv嗎???
**關於曆史版本:
*展示目前的目錄曆史資訊:
$svn log
這將展示項目各個版本的曆史資訊,每條記錄資訊包括誰、在什麼時候、改了多少,以及相應的描述修改的日誌資訊。日誌根據時間逆序排列。
*展示指定檔案的曆史:
$svn log foo.c
這將展示檔案foo.c的曆史資訊。
*按特定順序(或指定版本)展示曆史資訊:
$svn log -r 5:9
或$svn log --revision 9:5
或$svn log -r 8
這裡用了--revision(即-r)選項,前兩個分別按照時間順序和逆序顯示版本5和版本9之間的曆史;最後一個顯示版本8的曆史。
注意有時候得到的是空資訊,如:svn log -r 2
那不是錯,那是說明目前的目錄在指定版本到現在沒被修改過,可以用版本庫頂級目錄做為參數來查看。
如:svn log -r 2 http://svn.collab.net/repos/svn
*使用帶--revision的svn update和svn checkout來回到過去:
$svn checkout --revision 2
$svn update --revision 2
這會覆蓋當前的目錄版本嗎?還是可以指定URL來提取一個獨立的版本?
*得到一個指定時間的拷貝:
$svn checkout --revision {2002-09-08}
或$svn checkout --revision {15:30}
或$svn checkout --revision {20020908T1530}
等等。
這裡將會提取出離指定時間最近的版本,需要注意的是,假設指定了2002-09-08很有可能2002-09-07的某個時間更近,因為預設是以日期的0點開始的。
*顯示一段時間的版本曆史資訊:
$svn log -revision {2002-09-07}:{2009-09-08}
這會找到這個時間的所有曆史版本,也可版本號碼和時期混用表示時間段,不過不推薦這樣。
**
----------------------------
三,典型的工作周期:
1,更新你的工作拷貝:
$svn update
2,做出修改:
$svn add
$svn delete
$svn copy
$svn move
3,檢驗修改:
$svn status
$svn diff
$svn revert
4,合并別人的修改到你的工作拷貝:
$svn update
$svn resolved
5,提交你的修改:
$svn commit